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;