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

a8jjtwal  于 2023-01-18  发布在  .NET
关注(0)|答案(1)|浏览(130)

我正在写一个使用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.
}

由于CamiloTerevinto的注解,我将示例更改为HttpClient,得到了相同的结果。
顺便说一句:可以体验到相同的行为与Windows Powershell和Powershell核心。这似乎是一个普遍不同的实现框架和核心。

8i9zcol2

8i9zcol21#

除了评论中的回应,我发现HttpClient在.NET Core与.NET Framework上存在不同的问题。如果您在.NET Framework中的cookie中定义了授权,则必须使用HttpHandler中的CookieContainer:

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

而不是通过HttpRequestMessage头执行此操作:

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

第二种方法只能在.NET核心和.NET框架中工作,我不断收到401未经授权的响应。

相关问题