我没有准确了解NSwag如何与IdentityServerX承载令牌进行交互并按常规添加请求标头?我的主机api应用程序使用LDAP身份验证实现IdentityServer3,据我了解;如果任何主机需要一个令牌进行身份验证,那么任何客户端都必须在请求头上发送它。那么我在为NSwag客户工作时如何处理它呢?
任何想法都赞赏。 感谢。
答案 0 :(得分:7)
我已经通过部分方法解决了这个问题。 我的例子是:
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 - partial class:
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());
}
}
方法覆盖已经救了我!
答案 1 :(得分:7)
@ oguzhan-soykan和@peter答案都很好 - 这是@ peter答案的扩展,展示了如何实现基类,而不是为每个API客户端重复自己。
要求
.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>
答案 2 :(得分:6)
对于c#客户端,您可以指定
UseHttpClientCreationMethod
或UseHttpRequestMessageCreationMethod
这样,NSwag希望您实现创建HttpClient或HttpRequest的方法。您可以在没有任何魔法的情况下设置标题