.NET Core SPNEGO Auth с HttpClient - PullRequest
       44

.NET Core SPNEGO Auth с HttpClient

0 голосов
/ 11 сентября 2018

В настоящее время я пишу простой клиент на основе .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)

Клиент работает .NETCore 2.1, как было упомянуто в , эта проблема Я должен просто иметь возможность передавать учетные данные по умолчанию в обработчик, и он будет работать, как и ожидалось.

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

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

1 Ответ

0 голосов
/ 11 сентября 2018

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

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

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

...