繁体   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