![](/img/trans.png)
[英]getting 401 unauthorize while using IdentityModel.AspNetCore -1.0.0-rc.4.1
[英]Authorization header while using IdentityModel.AspNetCore
我正在使用IdentityModel.AspNetCore Package使用客户端凭据流访问受保护的 API。
在我的启动中,我有以下配置
services.AddAccessTokenManagement(options =>
{
options.Client.Clients.Add("oauth", new ClientCredentialsTokenRequest
{
Address = Configuration.GetValue<string>("Endpoint"),
ClientId = Configuration.GetValue<string>("ClientId"),
ClientSecret = Configuration.GetValue<string>("ClientSecret"),
Scope = Configuration.GetValue<string>("Scope")
});
});
services.AddClientAccessTokenClient("client", configureClient: client =>
{
client.BaseAddress = new Uri(Configuration.GetValue<string>("ApiBaseUrl"));
});
在我的服务中,我正在使用IHttpClientFactory
获取客户端实例
var client = clientFactory.CreateClient("client");
这段代码运行良好,我可以访问 API。
我的问题是,当我扩展从clientFactory
获得的客户端实例时,其中的授权 header 是 null。
所以我很困惑这是如何工作的。
我预计它将使用不记名令牌详细信息设置授权 header 值。
那么这是如何工作的呢? IdentityModel 如何设置不记名令牌?
(API 正确授权,好像我更改了客户端密码,它会给出 401)
.NET 允许您将DelegatingHandler
附加到HttpClient
以拦截和修改请求和响应。 在您发送请求后,它会在实际通过网络发送之前经过一堆处理程序。
public class MessageHandler1 : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
Debug.WriteLine("Process request");
// Call the inner handler.
var response = await base.SendAsync(request, cancellationToken);
Debug.WriteLine("Process response");
return response;
}
}
IdentityModel 库的工作方式相同。 它拦截请求,并在发送之前添加Authorization
处理程序。 然后它检查HTTP 401
错误的响应,并刷新令牌并重复请求。
这是它的工作原理( 来源):
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
await SetTokenAsync(request, forceRenewal: false, cancellationToken);
var response = await base.SendAsync(request, cancellationToken);
// retry if 401
if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
response.Dispose();
await SetTokenAsync(request, forceRenewal: true, cancellationToken);
return await base.SendAsync(request, cancellationToken);
}
return response;
}
至于似乎缺少的实际Authorization
header,您可以在HttpResponseMessage.RequestMessage
属性中找到它。
从文档(强调我的):
此属性设置为导致此响应消息的请求消息。 在使用 HttpClient 发送请求的情况下,此属性将指向导致最终响应的实际请求消息。 请注意,这可能与用户在发送请求时提供的消息不同。 如果由于重定向或身份验证需要重新发送请求,通常就是这种情况。 此属性可用于确定 URL 实际创建的响应(在重定向的情况下很有用)
更多参考资料:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.