HttpClient, UseDefaultCredentials, проверка подлинности Windows, консольное приложение .NET Core 2. 0+ получает 401 несанкционированный
Я пытаюсь сделать HTTP-вызов GET из консольного приложения .NET Core 3.0. Конечная точка ожидает аутентификацию Windows. Конечной точкой является рабочая служба веб-API.NET Framework 4.5.2 в IIS, успешно используемая несколькими клиентскими приложениями.
Моя тестовая программа успешно выполнена для целевой платформы net45
. Напротив, сборка netcoreapp3.0
получает 401 Несанкционированный.
Вот мой метод:
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
static async Task<string> Get(string serverUri, string requestUri)
{
var handler = new HttpClientHandler() { UseDefaultCredentials = true };
var client = new HttpClient(handler) { BaseAddress = new Uri(serverUri) };
return await client.GetStringAsync(requestUri);
}
Вот мой файл проекта.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net45;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<PackageReference Include="System.Net.Http" Version="4.3" />
</ItemGroup>
</Project>
Запуск .\bin\Debug\net45\HttpClientTest.exe
возвращает ожидаемый результат JSON.
Запуск dotnet .\bin\Debug\netcoreapp3.0\HttpClientTest.dll
получает 401 Несанкционированный.
Unhandled exception. System.AggregateException: One or more errors occurred. (Response status code does not indicate success: 401 (Unauthorized).)
---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized).
at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
at System.Net.Http.HttpClient.GetStringAsyncCore(Task'1 getTask)
at ConsoleApp1.Program.Get(String serverUri, String requestUri) in C:\temp\coreapp3\Program.cs:line 16
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task'1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task'1.get_Result()
at ConsoleApp1.Program.Main(String[] args) in C:\temp\coreapp3\Program.cs:line 22
Как мне это исправить?
Я также попробовал варианты ниже, без каких-либо изменений в выводе:
handler.Credentials = CredentialCache.DefaultNetworkCredentials;
handler.Credentials = CredentialCache.DefaultCredentials;
handler.Credentials = new NetworkCredential(username, password, domain);
Ответы
Ответ 1
Таким образом, мы сталкиваемся с той же проблемой с HttpClient, но по первому запросу это несанкционированное использование, но если мы сделаем еще один вызов быстрого запроса, все будет хорошо, и мы получим разрешение.
Если я делаю это в консольном приложении .NET 4.7.1, он работает отлично. Если я это сделаю в пустом веб-приложении .NET 4.7.1, он отлично работает, только если я делаю .NET Core 2.x, мы получаем эту проблему.
var result = string.Empty;
var responseMessage = _client.GetAsync(url).Result;
if (responseMessage.IsSuccessStatusCode)
{
result = await responseMessage.Content.ReadAsStringAsync();
}
else
{
var responseMessage2 = _client.GetAsync(url).Result;
if (responseMessage2.IsSuccessStatusCode)
{
result = await responseMessage2.Content.ReadAsStringAsync();
}
}
return result;