.net 如何调用需要请求头上的承载令牌的NSwag客户端方法?

daupos2t  于 2023-10-21  发布在  .NET
关注(0)|答案(4)|浏览(112)

我没有得到确切的NSwag如何与IdentityServerX承载令牌交互,并添加它的请求头传统?我的主机API应用程序实现了IdentityServer 3与LDAP认证,所以据我所知;如果任何主机需要令牌进行身份验证,则任何客户端都必须在请求报头上发送令牌。那么,我如何处理它,而工作NSwag客户端?
任何想法赞赏。谢谢.

wpx232ag

wpx232ag1#

@oguzhan-soykan和@peter的答案都很好--这里是@peter答案的扩展,展示了如何实现基类,而不是为每个API客户端重复自己。
要求

  • NSwag.MSBuild包
  • Swagger .JSON定义

创建一个公开所需功能的“Client”基类。可能是不记名代币。

public abstract class MySwaggerClientBase
{
    public string BearerToken { get; private set; }

    public void SetBearerToken(string token)
    {
        BearerToken = token;
    }

    // Called by implementing swagger client classes
    protected Task<HttpRequestMessage> CreateHttpRequestMessageAsync(CancellationToken cancellationToken)
    {
        var msg = new HttpRequestMessage();
        // SET THE BEARER AUTH TOKEN
        msg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", BearerToken);
        return Task.FromResult(msg);
    }

}

编辑swagger代码生成命令,以便为所有生成的客户机使用基类,并使用UseHttpRequestMessageCreationMethod选项。

<Project>
 ...
<Exec Command="$(NSwagExe) swagger2csclient /input:path-to-swagger-definition.json /output:$(ProjectDir)\Swagger.generated.cs /Namespace:MyNameSpace /ClientBaseClass:MySwaggerClientBase /UseHttpRequestMessageCreationMethod:true" />
 ...
</Project>
vwoqyblh

vwoqyblh2#

我用偏方的方法解决了这个问题。我的例子是:
CampaignClient.cs

public partial class CampaignClient
{
    partial void PrepareRequest(HttpClient request, ref string url);

    partial void ProcessResponse(HttpClient request, HttpResponseMessage response);

    //some codes...
}

CampaignClient.Extensions.cs -分部类:

public partial class CampaignClient
{
    private readonly IRequestContext _requestContext;
    private readonly IStartupConfiguration _startupConfiguration;

    public CampaignClient(IRequestContext requestContext, IStartupConfiguration startupConfiguration)
    {
        _requestContext = requestContext;
        _startupConfiguration = startupConfiguration;
    }

    partial void PrepareRequest(HttpClient request, ref string url)
    {
        request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _requestContext.GetBearerTokenOrTriggerUnauthException());
    }
}

方法覆盖救了我!

b09cbbtk

b09cbbtk3#

对于C#客户端,您可以指定UseHttpClientCreationMethodUseHttpRequestMessageCreationMethod
(Cf. https://github.com/RicoSuter/NSwag/blob/master/src/NSwag.CodeGeneration.CSharp/SwaggerToCSharpClientGeneratorSettings.cs
这样一来,NSwag就希望您实现用于创建HttpClient或HttpRequest的方法。你可以在那里设置你的标题,而不需要任何魔法。

knsnq2tg

knsnq2tg4#

如果你想使用接口而不是抽象类,那么这就是这种情况的解决方案
1.设置为客户端生成接口的选项

<OpenApiReference Include="OpenAPIs\swagger.json" CodeGenerator="NSwagCSharp" Namespace="YourNameSpace" ClassName="YourClient" >
    <Options>/GenerateClientInterfaces:true</Options>
</OpenApiReference>

1.向NSwag生成的部分接口添加第二个部分

public partial interface IYourClient
{
    void SetBearerToken(string token);
}

1.向NSwag生成的部分客户端添加第二个部分

public partial class YourClient
{
    private string? _token;

    public void SetBearerToken(string token) =>
        _token = token;

    partial void PrepareRequest(HttpClient client, HttpRequestMessage request, string URL)
    {
       if (!string.IsNullOrEmpty(_token))
          request.Headers.Authorization = new("Bearer", _token);   
    }
}

使用接口而不是抽象类的好处是所有操作都将在接口中定义,但基类不会在基类中创建抽象方法

相关问题