.Net Core HttpClient Digest Аутентификация

Работаю с API Mongo Atlas в приложении .Net Core 3.1, но я не могу заставить 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($"{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-запросы, поэтому я уверен, что мой пользователь / секрет / группа верны.

Кто-нибудь видит что-то не так с этим кодом или знает, что я могу сделать для дальнейшей отладки этой проблемы?


person Eric    schedule 27.01.2020    source источник


Ответы (1)


По-видимому, у нас точно такая же проблема, или у меня была, по крайней мере, до тех пор, пока мой коллега не нашел для нее решение.

Во внутреннем устройстве HttpClient в 2.1 было внесено много изменений для поддержки нового SocketsHttpHandler, используйте эту строку кода, чтобы вернуться к функциональности 2.0, и она должна снова работать, поместите ее Main или где-то еще до вызовов, которые вы делаете.

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

В противном случае вам придется сначала отправить один запрос, получить ответ 401, захватить nonce из заголовка WwwAuthenticate, и вам, вероятно, также потребуется установить еще несколько полей в заголовке.

Ваше здоровье!

Нашел в этом сообщении на Reddit: https://www.reddit.com/r/dotnet/comments/9yailz/weird_dotnet_core_httpclient_bug_maybe/ea07edd/

person Philip Jernås    schedule 31.01.2020
comment
Этот обходной путь больше не работает в .Net 5, кто-нибудь нашел решение? - person Sivan Krigsman; 07.01.2021
comment
В итоге я создал собственный обработчик, похожий на stackoverflow.com/questions/3109507/ - person Eric; 02.03.2021
comment
@Eric, вы должны опубликовать обработчик, если он сработал для вас, нет? - person David Noreña; 08.03.2021