Сбой аутентификации 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
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 (если это включено) затем -> нажмите на Провайдера в правой части панели действий.
Здесь вы можете переместиться вверх / убрать опции "Переговоры".