![](/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.