Аутентификация вызовов HttpClient из .NET Core на MacOS - PullRequest
0 голосов
/ 12 января 2019

Мой вопрос сегодня:
Как настроить HttpClient, чтобы он мог аутентифицировать вызов, не беспокоя пользователя в MacOS?
(Консольное приложение .NET Core 2.2, работающее в качестве агента запуска в MacOS и вызывающее веб-API в IIS с включенными NTLM и Kerberos, по внутренней сети нашей компании)

Длинная история:
У меня есть приложение .NET Core, которое использует следующий метод для вызова веб-API:

var handler = new HttpClientHandler() 
{ 
   UseDefaultCredentials = true 
};

var client = new HttpClient(handler)
{
   BaseAddress = new Uri("https://MyWebAPI.MyCompanyName.com/")
};

string result = client.GetAsync("MyEndpointSubURL")
    .Result.Content.ReadAsStringAsync().Result;

Когда я запускаю это на своем компьютере с Windows, приложение легко подключается и получает результат.
Однако, когда я запускаю это на Mac, я получаю исключение:

Interop+NetSecurityNative+GssApiException - GSSAPI operation failed with error
The provided name was not a mechanism name. (unknown mech-code 0 for mech unknown).
at Microsoft.Win32.SafeHandles.SafeGssNameHandle.CreatePrincipal(String name)

Есть идеи, что мне нужно изменить, чтобы это работало?

Мы отчаянно хотим не беспокоить пользователя подсказками (это должна быть служба фоновой синхронизации).

Напомним, это консольное приложение .NET Core 2.2, работающее в качестве агента запуска в MacOS. Веб-API, который он вызывает, - это веб-API Asp.NET, размещенный с IIS с включенными NTLM и Kerberos, и мне нужно только пройти IIS (веб-API сам по себе не использует никаких механизмов аутентификации / авторизации). API предоставляется только через внутреннюю сеть нашей компании, поэтому пользователь уже вошел в сеть.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Я не думаю, что MacOS имеет концепцию «аутентификации по умолчанию» так же, как Windows. Kerberos и NTLM являются концепциями Windows. Я подозреваю, что в MacOS вам придется использовать другую схему аутентификации (Basic или Bearer), а затем получить учетные данные откуда-нибудь, например, из Keychain. IIRC приложению может быть предоставлен доступ в режиме без вывода сообщений к цепочке ключей.

0 голосов
/ 23 мая 2019

Попробуйте запустить kinit <username>@<DOMAIN> из терминала, а затем снова запустить вашу программу. Возможно, вам потребуется настроить файл krb5.conf, чтобы он правильно указывал на контроллер домена.

У нас есть «учетные данные по умолчанию», работающие в нашей системе на Mac с .NET Core 2.1+ с использованием того же кода, который вы там видите. Конфигурирование Kerberos через kinit и файл conf является самой сложной задачей.

Исходя из того, что я могу сказать, .NET не использует кэш, созданный при запуске kinit, но это то, что настраивает принципал, который будет использоваться. Взаимодействие .NET с Kerberos плохо документировано. Смотри https://github.com/dotnet/corefx/issues/30203#issuecomment-395592407

0 голосов
/ 12 января 2019

Попробуйте это: С базовым примером аутентификации.

            var url = "https://MyWebAPI.MyCompanyName.com/";
            using (var httpClient = new HttpClient())
            {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "Base64Credetials");

                using (var response = await httpClient.GetAsync(url))
                    if (response.IsSuccessStatusCode)
                    {
                        var strResponse = await response.Content.ReadAsStringAsync();
                        MyObject result = JsonConvert.DeserializeObject<MyObject>(strResponse);
                        if (result != null)
                        {
                            //Your code here
                        }
                    }
            }
...