.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 无效