我正在使用dotnet core 1.1.2构建RESTful API。
此API的很大一部分需要向外部WCF服务发出请求。这些请求使用基于Windows的身份验证与用户名,密码和域进行身份验证。
我目前正在准备api生产,我想尝试将其停靠。
我遇到的问题是,一旦从docker容器中调用它,就会对第三方WCF服务进行身份验证失败。使用dotnet运行时运行API可以在windows和mac中运行,服务也可以按原样进行身份验证。
我使用Visual Studio 2017的Connect wcf服务功能使用WCF服务,然后使用正确的身份验证修改端点绑定 模式。
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主机进行桥接。
如果任何对dotnet核心内部的Docker或WCF消费有更多了解的人可能会有一些见解,那将非常有帮助。
最好的问候,Linus。
答案 0 :(得分:2)
对于遇到相同问题的任何人来说,这是由于在非Windows平台上配置kerberos的方式。这与docker无关,而是作为基于linux的容器运行。
解决方案是将平台切换到Windows或在平台上正确配置kerberos身份验证。这在以下github问题中有更详细的讨论:
https://github.com/dotnet/wcf/issues/2641 和 https://github.com/dotnet/corefx/issues/9533