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

问题描述 投票:8回答:3

我没有准确了解NSwag如何与IdentityServerX承载令牌进行交互并按常规添加请求标头?我的主机api应用程序使用LDAP身份验证实现IdentityServer3,据我了解;如果任何主机需要一个令牌进行身份验证,那么任何客户端都必须在请求头上发送它。那么我如何在为NSwag客户工作时处理它呢?

任何想法都赞赏。谢谢。

.net asp.net-web-api identityserver3 nswag
3个回答
9
投票

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

要求

  • NSwag.MSBuild包
  • Swagger .JSON定义

创建一个基础“客户端”类,公开您需要的功能。可能是不记名令牌属性。

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>

8
投票

我已经通过部分方法解决了这个问题。我的例子是:

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());
    }
}

方法覆盖已经救了我!


6
投票

对于c#客户端,您可以指定qazxsw poor qazxsw poi

(参见UseHttpClientCreationMethod

这样,NSwag希望您实现创建HttpClient或HttpRequest的方法。您可以在没有任何魔法的情况下设置标题

© www.soinside.com 2019 - 2024. All rights reserved.