System.Net.Http.HttpClient如何选择认证类型?

Posted

技术标签:

【中文标题】System.Net.Http.HttpClient如何选择认证类型?【英文标题】:How does the System.Net.Http.HttpClient select authentication type? 【发布时间】:2019-05-17 07:59:05 【问题描述】:

假设我新建了 HttpClient 并向受保护的端点发送请求,如下所示:

var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "url");
var response = await httpClient.SendAsync(request);

然后我会收到带有以下标题的响应:

HTTP/1.1 401 Unauthorized
Content-Type: text/html
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic
Date ...

从响应标头中,我看到我有三个不同的选项来向服务器进行身份验证(协商、NTLM、基本)。然后我将我的代码更新为:

var httpClientHandler = new HttpClientHandler

    Credentials = new NetworkCredential
    
        UserName = "username",
        Password = "password"
    
;
var httpClient = new HttpClient(httpClientHandler);
var request = new HttpRequestMessage(HttpMethod.Get, "url");
var response = await httpClient.SendAsync(request);

我再次执行我的程序,这次我得到了 200 OK 作为回报。一切都好。

如果我用 fiddler 检查请求,我看到HttpClient 决定使用“协商”作为身份验证方法。

现在,我的问题是:HttpClient 如何决定应用哪种身份验证类型?某些身份验证类型是否优先于其他身份验证类型?

NetworkCredential 上的文档指出:

NetworkCredential 类是提供凭据的基类 在基于密码的身份验证方案中,例如基本、摘要、NTLM、 和 Kerberos。

...所以我知道我提供的凭据可能已应用于所有三种身份验证类型,但我无法弄清楚它如何/为什么选择特定身份验证类型而不是另一种。

非常感谢您对此的任何见解,在此先感谢!

【问题讨论】:

它在响应中按顺序排列。协商是第一位的,协商是系统可以处理的,所以它继续尝试。 【参考方案1】:

您可以使用 GetCredential 方法,它会为您提供具有身份验证类型的凭据。有点奇怪但有效:

var httpClientHandler = new HttpClientHandler

    Credentials = new NetworkCredential
    
        UserName = "username",
        Password = "password"       
    .GetCredential("*", 80, "Basic") // Substitute * and 80 with url and port if possible
;
var httpClient = new HttpClient(httpClientHandler);
var request = new HttpRequestMessage(HttpMethod.Get, "url");
var response = await httpClient.SendAsync(request);

评论澄清后

当您有多种身份验证类型时,客户端必须使用可用的最强方法(但有时这很难说)。

来源: HTTP Authentication - WWW-Authenticate header - multiple realms

【讨论】:

您好,Oscar,感谢您抽出宝贵时间查看这个问题。我不确定您的答案是否涵盖HttpClient 在多个选项可用时如何选择要使用的身份验证类型。但再次感谢您的贡献! :) 哦,我明白了,我以为您正在尝试选择身份验证类型GetCredential("*", 80, "Basic")

以上是关于System.Net.Http.HttpClient如何选择认证类型?的主要内容,如果未能解决你的问题,请参考以下文章