Проверка подлинности 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
Аутентификация 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, и отправляет соответствующий ответ.
Другими словами, аутентификация NTLM является неявной.