Аутентификация .NET Core SPNEGO с помощью HttpClient

В настоящее время я пишу простой клиент на основе .NET Core для взаимодействия с кластерами Hadoop через WebHCat, и я пытаюсь выяснить, как пройти аутентификацию с помощью SPNEGO, как в чем-то вроде curl или Powershell Core.

Используя Curl, я могу запросить конечную точку состояния WebHCat следующим образом:

curl "http://10.2.0.9:50111/templeton/v1/status" --negotiate -k -u :

Тот же запрос можно выполнить и в Powershell Core:

$client = New-Object System.Net.WebClient;
$client.UseDefaultCredentials = $true;
$client.DownloadString("http://10.2.0.9:50111/templeton/v1/status");

Однако когда дело доходит до запуска следующего в проекте .NET Core, расположенном на том же сервере, что и кластер:

using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace testauth
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var host = "http://10.2.0.9:50111/templeton/v1/status";
            var handler = new HttpClientHandler
            {
                UseDefaultCredentials = true,
                AllowAutoRedirect = true,
            };
            using (var client = new HttpClient(new LoggingHandler(handler)))
            {
                var res = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, host));
            }
        }
    }

}

Я получаю следующую ошибку:

Unhandled Exception: System.ComponentModel.Win32Exception: GSSAPI operation failed with error - An invalid status code was supplied (Server not found in Kerberos database).
   at System.Net.NTAuthentication.GetOutgoingBlob(Byte[] incomingBlob, Boolean throwOnError, SecurityStatusPal& statusCode)

На клиенте работает .NET Core 2.1, поэтому, как было упомянуто в этой проблеме, я должен просто иметь возможность передавать учетные данные по умолчанию в обработчик, и он будет работать должным образом.

Я также пытался написать тот же код, который я использовал в PowerShell Core на C #, и, несмотря на то, что код идентичен, он все равно выдает ту же ошибку?

Единственная другая информация, которую я могу сообщить, это то, что Kerberos подключен к экземпляру Active Directory только с одним пользователем, и все эти запросы выполняются после того, как билет для этого пользователя был создан с помощью kinit.


person user1994100    schedule 10.09.2018    source источник


Ответы (1)


Мне удалось найти исправление. С ASP.NET В Core 2.1 они представили новый SocketsHttpHandler, который по умолчанию используется для запросов. Это означает, что на некоторых платформах он может переопределить HttpHandler, указанный в моем запросе, поэтому по умолчанию вы должны использовать обработчик сокетов:

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

Это исправило мой запрос.

person user1994100    schedule 11.09.2018