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