Вызов службы WCF с аутентификацией NTLM из .NET Core в Linux - PullRequest
2 голосов
/ 15 мая 2019

Я не могу успешно вызвать службу WCF с проверкой подлинности NTLM из .NET Core, работающего на компьютере с Linux (Docker-контейнер). Этот же код прекрасно работает в Windows 10.

Что я сделал:

  • Добавьте это к ConfigureServices:
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
  • Выполнить apt-get -y install gss-ntlmssp
  • Это код до вызова службы:
var client = new WcfServiceSoapClient();
client.Endpoint.Address = new EndpointAddress(settings.Uri);
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential
{
    Domain = settings.Domain,
    UserName = settings.Username,
    Password = settings.Password
};
var binding = (BasicHttpBinding)client.Endpoint.Binding;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Ntlm;

Как уже упоминалось, это прекрасно работает в Windows 10. В Linux регистрируется следующая ошибка:

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'NTLM, Negotiate'.
   at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.<>c__DisplayClass1_0.<CreateGenericTask>b__0(IAsyncResult asyncResult)

Вопрос: почему он все еще не работает в Linux?

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

У меня была та же проблема, и я смог ее исправить, с большой помощью ребят из сетевого ядра GitHub.

По существу, сетевое ядро ​​использует базовую ОС для обработки http-вызовов.Раньше в Linux использовался libCurl, но более новый SocketsHttpHandler использует gss, который не поддерживает ntlm (по крайней мере, в изображении «microsoft / dotnet: 2.2-aspnetcore-runtime-stretch-slim»).

Чтобы это исправить, вам нужно установить дополнительную библиотеку в свой контейнер, используя файл Docker.Сразу после

ОТ microsoft / dotnet: 2.2-aspnetcore-runtime-stretch-slim *

(или любое другое изображение, которое вы используете)

в следующей строке добавьте следующее:

RUN apt-get update && apt-get install -y --no-install-рекомендует apt-utils gss-ntlmssp

Надеюсь, это поможет!

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

Я обнаружил, что если мы удалим поставщика согласований в Windows Authentication на стороне сервера, проект будет работать независимо от способа вызова.
enter image description here
Кажется, что Netframeworkбудет автоматически согласовывать способ аутентификации, Core не может, что должно быть ошибкой.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...