Dotnet core web api, запущенный внутри docker, не проходит проверку подлинности при использовании внешней службы WCF
Я создаю RESTful API, используя dotnet core 1.1.2.
большая часть этого api требует выполнения запросов к внешней службе WCF. Эти запросы проверяются с помощью проверки подлинности windows с именем пользователя, паролем и доменом.
в настоящее время я в процессе подготовки производства api, и я хотел бы попробовать его докеризацию.
проблема, с которой я сталкиваюсь, заключается в том, что аутентификация завершается неудачей в отношении этой сторонней службы WCF, как только он вызван из контейнера докера. Запуск API с помощью среды выполнения dotnet работает как с windows, так и с mac, и служба проходит проверку подлинности как следует.
Я использую службу WCF с помощью функции Connect WCF service Visual studio 2017, а затем изменяю привязку конечной точки с помощью правильной проверки подлинности режим.
public ServiceSoapClient(EndpointConfiguration endpointConfiguration, string username, string password, string domain) :
base(ServiceSoapClient.GetBindingForEndpoint(endpointConfiguration), ServiceSoapClient.GetEndpointAddress(endpointConfiguration))
{
this.ChannelFactory.Credentials.Windows.ClientCredential.UserName = username;
this.ChannelFactory.Credentials.Windows.ClientCredential.Password = password;
this.ChannelFactory.Credentials.Windows.ClientCredential.Domain = domain;
this.Endpoint.Name = endpointConfiguration.ToString();
ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
}
private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
{
if ((endpointConfiguration == EndpointConfiguration.ServiceSoap))
{
System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
result.MaxBufferSize = int.MaxValue;
result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
result.MaxReceivedMessageSize = int.MaxValue;
result.AllowCookies = true;
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
result.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
return result;
}
throw new System.InvalidOperationException(string.Format("Could not find endpoint with name '{0}'.", endpointConfiguration));
}
Я пробовал как Ntml, так и Windows в качестве ClientCredentialType.
Я проверил, что аутентификация учетные данные не перепутаются при передаче api в контейнер docker путем жесткого кодирования учетных данных внутри приложения, а затем запуска его с помощью обычной среды выполнения dotnet для проверки его работы. Наконец, создание образа docker с точно таким же опубликованным приложением и запуск его снова. Когда точно такое же приложение работает внутри docker, оно не аутентифицируется.
выход из приложения:
The HTTP request is unauthorized with client authentication scheme ‘Negotiate’. The authentication header received from the server was ‘Negotiate, NTLM’.
что это тот же вывод, что если когда я использую неверные учетные данные.
мне интересно, может ли это быть как-то связано с тем, как сеть работает с docker, и если api не может вести переговоры со службой WCF, так как он соединяется через хост docker.
Если кто-то более осведомленный с docker или WCF consumtion внутри dotnet core может иметь некоторое представление, это было бы очень полезно.
С наилучшими пожеланиями, Лайнус.
1 ответов
для тех, кто испытывает ту же проблему, это связано с тем, как kerberos настроен на платформах, отличных от windows. Это не имеет ничего общего с docker per say, а работает как контейнер на базе linux.
решение состоит в том, чтобы либо переключить платформу на windows, либо правильно настроить проверку подлинности kerberos на платформе. Это обсуждается более подробно в следующих вопросах github:
https://github.com/dotnet/wcf/issues/2641 и https://github.com/dotnet/corefx/issues/9533