.NET Core HttpClient 摘要认证

4
在 .Net Core 3.1 应用程序中使用 Mongo Atlas API,但是我无法让 HttpClient 处理 Digest 验证的挑战。代码发送第一个请求,获取 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($"{domain}api/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个回答

7

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

HttpClient 内部在2.1中有很多变化以支持新的 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 中已经不再适用了,有人找到了解决方案吗? - Sivan Krigsman
我最终创建了一个类似于 https://dev59.com/-U7Sa4cB1Zd3GeqP5KSk 的自定义处理程序。 - Eric
@Eric,如果这个处理程序对你有用的话,你应该发布一下吧? - David Noreña
1
如果其他人正在寻找更详细的答案和完整的实现,我写了一篇博客文章来展示如何从头开始完成:https://dev.to/callumhoughton18/implementing-digest-authentication-in-net-396j - Callum Houghton
我只是复制并粘贴了@CallumHoughton链接中的所有方法,然后就成功了,太棒了! - WtFudgE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接