[英]NetWorkCredentials not showing up in headers
我有两个项目:一个 Web API 项目和一个客户项目。
在客户端应用程序中,我像这样配置我的HttpClient
。
services.AddHttpClient<TrackAndTraceClient>()
.ConfigureHttpClient(httpClient =>
{
httpClient.BaseAddress = new Uri(settings.BaseUrl);
httpClient.Timeout = TimeSpan.FromMinutes(5);
})
.ConfigurePrimaryHttpMessageHandler(serviceProvider =>
{
return new HttpClientHandler()
{
Credentials = new NetworkCredential(settings.Username, settings.Password),
};
});
然后在我的 class 中调用 API:
public TrackAndTraceClient(IHttpClientFactory httpClientFactory, IOptions<TrackAndTraceSettings> settings)
{
HttpClient = httpClientFactory.CreateClient(nameof(TrackAndTraceClient));
Settings = settings.Value;
}
我的 Web API 站点使用本文中描述的技术实现基本身份验证。 但是我的代码抛出异常,因为没有找到授权header。
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// ...
if (!Request.Headers.TryGetValue("Authorization", out StringValues authHeaderValues))
throw new Exception("Missing Authorization header");
// ...
}
}
我只能通过将以下代码添加到调用 API 的 class 中来使其工作:
HttpClient.DefaultRequestHeaders.Add("ContentType", "application/json");
byte[] credentialsData = Encoding.UTF8.GetBytes($"{Settings.Username}:{Settings.Password}");
string credentials = Convert.ToBase64String(credentialsData);
HttpClient.DefaultRequestHeaders.Add("Authorization", $"Basic {credentials}");
谁能告诉我为什么需要最后一段代码? 为什么使用NetworkCredential
设置凭据似乎没有任何作用? 以及如何更改我的 Web API 以便它使用原始方式指定的凭据?
请注意,我还调用了第三方 API,并且客户端的配置方式与我的第一个代码块中的方式完全相同。 所以我知道这可以发挥作用。
从我们在评论部分的对话中——
BasicAuthenticationHandler
的实现缺少添加WWW-Authenticate
HTTP
header (值为Basic
)。
那就是 header , HttpClient
在收到401
Unauthorized
响应时会做出反应以包含Authorization
HTTP
header。
要解决此问题,请将下面的行添加到BasicAuthenticationHandler
。
Response.Headers.Add("WWW-Authenticate", "Basic");
现在NetworkCredentials
将 go 转换为Authorization
HTTP
header。
简而言之,它的工作原理并不完整;
当HttpClient
发出请求(没有Authorization
标头)并收到401 Unauthorized
与WWW-Authenticate
组合时,它将使用Authorization
HTTP
header 中配置的凭据(如果有)进行第二次尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.