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