繁体   English   中英

NetWorkCredentials 未显示在标题中

[英]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 UnauthorizedWWW-Authenticate组合时,它将使用Authorization HTTP header 中配置的凭据(如果有)进行第二次尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM