我正在写一个使用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核心。这似乎是一个普遍不同的实现框架和核心。
1条答案
按热度按时间8i9zcol21#
除了评论中的回应,我发现HttpClient在.NET Core与.NET Framework上存在不同的问题。如果您在.NET Framework中的cookie中定义了授权,则必须使用HttpHandler中的CookieContainer:
而不是通过HttpRequestMessage头执行此操作:
第二种方法只能在.NET核心和.NET框架中工作,我不断收到401未经授权的响应。