Проверка подлинности NTLM HttpClient в ядре

Я пытаюсь использовать HttpClient для доступа к службе REST, которая требует проверки подлинности NTLM. Однако я продолжаю получать 401 Несанкционированный. Мой код выглядит так

    private static void Main()
    {
        var uri = new Uri("http://localhost:15001");
        var credentialsCache = new CredentialCache { { uri, "NTLM", CredentialCache.DefaultNetworkCredentials } };
        var handler = new HttpClientHandler { Credentials = credentialsCache };
        var httpClient = new HttpClient(handler) { BaseAddress = uri, Timeout = new TimeSpan(0, 0, 10) };
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var response = httpClient.GetAsync("api/MyMethod").Result;
    }

Моя целевая среда - netcoreapp2.0. Если я перейду на net461, он будет работать. Не уверен, что я делаю не так?

2 ответа

Решение

Microsoft приняла это как ошибку. Возможно исправление будет выпущено с ядром 2.1

https://github.com/dotnet/corefx/issues/25988

Аутентификация NTLM по умолчанию и аутентификация Kerberos используют учетные данные пользователя Microsoft Windows, связанные с вызывающим приложением, для попытки аутентификации на сервере. При использовании аутентификации NTLM, отличной от стандартной, приложение устанавливает тип аутентификации NTLM и использует объект NetworkCredential для передачи имени пользователя, пароля и домена узлу, как показано в следующем примере.

      string myUri = "http://www.contoso.com/";
using HttpClientHandler handler = new()
{
    Credentials = new NetworkCredential(UserName, SecurelyStoredPassword, Domain),
};
using HttpClient client = new(handler);
string result = await client.GetStringAsync(myUri);
// Do Other Stuff...

Приложения, которым необходимо подключаться к службам Интернета с использованием учетных данных пользователя приложения, могут сделать это с учетными данными пользователя по умолчанию, как показано в следующем примере.

      string myUri = "http://www.contoso.com/";
using HttpClientHandler handler = new()
{
    Credentials = CredentialCache.DefaultCredentials,
};
using HttpClient client = new(handler);
string result = await client.GetStringAsync(myUri);
// Do Other Stuff...

Модуль согласования аутентификации определяет, использует ли удаленный сервер аутентификацию NTLM или Kerberos, и отправляет соответствующий ответ.

https://learn.microsoft.com/en-us/dotnet/framework/network-programming/ntlm-and-kerberos-authentication

Другими словами, аутентификация NTLM является неявной.

Другие вопросы по тегам