![](/img/trans.png)
[英]Different behaviour of Newtonsoft.Json on .NET 5 / Core and .NET Framework
[英]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.