Сбой аутентификации SOAP при запуске приложения aC# на Linux

Я пытаюсь подключиться к стороннему сервису SOAP через приложение aC#. Следующий код работает при запуске приложения на компьютере с Windows:

var ws = new MyWebServiceClient();
ws.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("myusername", "mypassword", "mydomain");
var response = ws.SomeEndpoint();
Element xmlResult = response.Result.SomeEndpoint;
...

Но если я запускаю один и тот же код из Linux или Mac OS, он не работает с:

The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate, NTLM'.

У меня есть приложение на Python, которое может использовать тот же сервис SOAP при работе в любой операционной системе, не сталкиваясь с проблемами, поэтому проблема не в моем дистрибутиве / настройке Linux.

Кто-нибудь видел подобную проблему с ядром.NET или нашел обходной путь?

Я нашел этот отчет о проблеме, который предполагает, что более ранние версии ядра.NET имели ограничения / ошибки, которые могли вызывать поведение, подобное тому, что я вижу, но он утверждает, что эти проблемы были решены после RC2.

Если предположить, что отчет о проблеме неверен и проблема по-прежнему сохраняется в дистрибутиве ядра.NET для Linux / Mac, кто-нибудь знает, как мне получить CredentialCache Обходной путь, предложенный в этой статье, работа с клиентом SOAP? Я довольно новичок в.NET и супер новичок в мыльных клиентах.NET, поэтому прошу прощения, если это наивный вопрос.

Похоже, что для не-Windows, ядро ​​.NET не может попытаться NTLM после сбоя согласования. Из приложения python я знаю, что NTLM работает с этим конкретным SOAP-сервисом. Как я могу заставить его пропустить "Переговоры" и перейти прямо к NTLM? Кажется, это то, что CredentialCache Обходной путь, из вышеупомянутой статьи, делает. Я просто не могу понять, как заставить это работать с сервисом SOAP...

2 ответа

SOAP-клиент.Net Core с NTLM-аутентификацией и CredentialCache

Как описано в MSDN и здесь,

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();

basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;

basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

EndpointAddress endpoint = new EndpointAddress("http://myservice");

var factory = new ChannelFactory<IMyService>(basicHttpBinding, endpoint);
CredentialCache myCredentialCache = new CredentialCache();

NetworkCredential myCreds = new NetworkCredential("username", "password", "domain");
myCredentialCache.Add("ContoscoMail", 45, "NTLM", myCreds);
factory.Credentials.Windows.ClientCredential = 
         myCredentialCache.GetCredential("ContosoMail", 45, "NTLM");

var client = factory.CreateChannel(); 

// ... use the webservice

Обновление: это ошибка, исправленная в 2.1

Как уже встречалось здесь и исправлено здесь как ошибка, он должен работать с.net core 2.1 (не выпущен и не запланирован на первый квартал 2018 года). Итак, прямо сейчас, вы должны попытаться использовать другой тип аутентификации при подключении из Linux (посмотрите на RuntimeInformation.IsOSPlatform).

Важно знать, как аутентификация работает по-разному в Windows/ Консольное приложение и веб-приложение.

Ответы на ваш вопрос, чтобы пропустить переговоры (с сервера): Перейдите в IIS -> Перейти на сайт / приложение -> Выбрать аутентификацию (дважды щелкните по ней)-> Здесь вы увидите параметры -> Под аутентификацией Windows (если это включено) затем -> нажмите на Провайдера в правой части панели действий.

Здесь вы можете переместиться вверх / убрать опции "Переговоры".

Другие вопросы по тегам