![](/img/trans.png)
[英]Step by step NTLM authentication with System.Net.Http.HttpClient
[英]How does the System.Net.Http.HttpClient select authentication type?
假設我新建了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 ...
從響應頭,我看到我有三個不同的選項來驗證服務器(Negotiate,NTLM,Basic)。 然后我將我的代碼更新為:
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
決定使用“Negotiate”作為身份驗證方法。
現在,我的問題是: HttpClient
如何決定應用哪種身份驗證類型? 某些身份驗證類型優先於其他身份驗證類型嗎?
NetworkCredential
上的文檔指出:
NetworkCredential類是一個基類,它在基於密碼的身份驗證方案(如basic,digest,NTLM和Kerberos)中提供憑據。
...所以我知道我提供的憑據可能已經應用於所有三種身份驗證類型,但我無法弄清楚它是如何/為什么選擇特定的身份驗證類型而不是另一種身份驗證類型。
我們非常感謝您對此的任何見解,在此先感謝!
您可以使用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);
當您有多個身份驗證類型時,客戶端必須使用最強大的方法(但有時這很難說)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.