簡體   English   中英

.NET 核心和 .NET 框架中 HttpWebRequest/HttpClient 的不同行為

[英]Different behaviour of HttpWebRequest/HttpClient in .NET Core and .NET Framework

我正在編寫一個控制台應用程序,它使用 SSO(Windows 身份驗證)登錄第三方 web API。代碼適用於 .NET Framework 4.6.1,但不適用於 .NET Core 3.1。

在測試期間,我將問題簡化為從身份提供者獲取令牌的請求,並創建了兩個應用程序,一個使用 .NET Framework 4.6.1,另一個使用 .NET Core 3.1,Main 中的代碼完全相同:

string uri = "http://<server>/connection/single-sign-on/identity-providers/90c22f9b-0a9d-4474-87f4-b48eccbe3095?singleSignOnCapabilities=saml2Redirect";
try {
   using (HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true })) {
      var response = client.GetAsync(uri).Result;
      Console.WriteLine(response.StatusCode);
      if (response.IsSuccessStatusCode) {
         // Get token from response header
         // This works with .NET 4.6.1 
      }
   }
}
catch {
    // In .NET Core 3.1 I get an exception: The remote server returned an error: (401) Unauthorized.
}

由於 Camilo Terevinto 的評論,我將示例更改為 HttpClient,結果相同。

順便說一句:可以體驗與 Windows Powershell 和 Powershell Core 相同的行為。 它似乎是 Framework 和 Core 上的一般不同實現。

除了評論中的回應之外,我發現 .NET Core 與 .NET Framework 上的 HttpClient 存在不同的問題。 如果您在 .NET Framework 中的 cookies 中定義了授權,則必須使用 HttpHandler 中的 CookieContainer 來完成:

var cookieContainer = new CookieContainer();
var handler = new HttpClientHandler
{
   CookieContainer = cookieContainer
};

而不是通過 HttpRequestMessage header 來做:

var message = new HttpRequestMessage(HttpMethod.Post, <ip>);
message.Headers.Add("Cookie", <cookie>);

第二種方式只適用於 .NET Core 和 .NET Framework 我不斷收到 401 Unathorized 響應。

暫無
暫無

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

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