.Net Core HttpClient 摘要式身份验证

Posted

技术标签:

【中文标题】.Net Core HttpClient 摘要式身份验证【英文标题】:.Net Core HttpClient Digest Authentication 【发布时间】:2020-01-27 21:44:56 【问题描述】:

在 .Net Core 3.1 应用程序中使用 Mongo Atlas API,但我无法让 HttpClient 处理来自摘要身份验证的挑战。

代码发送第一个请求,得到 401 响应,然后没有通过正确的身份验证重新发送。

下面是我一直在尝试的代码

var domain = "https://cloud.mongodb.com/";
var credCache = new CredentialCache();
credCache.Add(new Uri(domain),"Digest", new NetworkCredential(user,secret));
var httpClient = new HttpClient( new HttpClientHandler  Credentials = credCache);
var answer = await httpClient.GetAsync(new Uri($"domainapi/atlas/v1.0/groups/groupId/databaseUsers"));

这是我收到的回复

StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:

  Date: Mon, 27 Jan 2020 21:03:14 GMT
  WWW-Authenticate: Digest realm="MMS Public API", domain="", nonce="generatedNonce", algorithm=MD5, qop="auth", stale=false
  Content-Type: application/json
  Content-Length: 106

我已成功发送 curl 请求,因此我确定我的用户/密码/组是正确的。

是否有人发现该代码有问题,或者知道我可以做些什么来进一步调试此问题?

【问题讨论】:

【参考方案1】:

显然我们遇到了完全相同的问题,或者至少在我的同事找到解决方案之前我也遇到过。

在 2.1 中对 HttpClient 内部进行了很多更改以支持新的 SocketsHttpHandler,使用这行代码返回到 2.0 的功能,它应该可以再次工作,把它放在Main 或者在你调用之前的某个地方制作。

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

否则您必须先发送一个请求以获取401 响应从WwwAuthenticate 标头中获取nonce,并且您可能还需要在标头中设置更多字段。

干杯!

在 reddit 上的这篇帖子中找到它:https://www.reddit.com/r/dotnet/comments/9yailz/weird_dotnet_core_httpclient_bug_maybe/ea07edd/

【讨论】:

此解决方法在 .Net 5 中不再有效,有人找到解决方案了吗? 我最终创建了一个类似于***.com/questions/3109507/…的自定义处理程序 @Eric 你应该发布处理程序,如果它对你有用吗?

以上是关于.Net Core HttpClient 摘要式身份验证的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core Httpclient 有效,但 .Net Framework 4.7.2 httpclient 无效

.NET CORE HttpClient使用

.Net及.Net Core下HttpClient详解

《ASP.NET Core 6框架揭秘》实例演示[18]:HttpClient处理管道

在.NET Core使用 HttpClient 的正确方式

.net core HttpClient 使用之消息管道解析