簡體   English   中英

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);

評論澄清后

當您有多個身份驗證類型時,客戶端必須使用最強大的方法(但有時這很難說)。

來源: HTTP身份驗證 - WWW-Authenticate標頭 - 多個領域

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM