从Linux上的.NET Core使用NTLM身份验证调用WCF服务

时间:2019-05-15 13:13:43

标签: c# linux wcf .net-core ntlm

我无法从运行在Linux机器(docker容器)上的.NET Core从NTLM身份验证成功调用WCF服务。 相同的代码可以在Windows 10上完美地工作。

我做了什么:

  • 将此添加到ConfigureServices
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
  • 运行apt-get -y install gss-ntlmssp
  • 这是调用服务之前的代码:
var client = new WcfServiceSoapClient();
client.Endpoint.Address = new EndpointAddress(settings.Uri);
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential
{
    Domain = settings.Domain,
    UserName = settings.Username,
    Password = settings.Password
};
var binding = (BasicHttpBinding)client.Endpoint.Binding;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Ntlm;

如前所述,这在Windows 10上运行良好。在Linux上,记录以下错误:

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'NTLM, Negotiate'.
   at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.<>c__DisplayClass1_0.<CreateGenericTask>b__0(IAsyncResult asyncResult)

问题是:为什么它在Linux上仍然失败?

2 个答案:

答案 0 :(得分:0)

我发现,如果我们在服务器端的Windows身份验证中删除Negotiate提供程序,则无论采用哪种调用方式,该项目都将起作用。
enter image description here
Netframework似乎会自动协商身份验证方式,而Core不能,这应该是一个错误。
请随时告诉我是否有什么可以帮忙的。

答案 1 :(得分:0)

在网络核心GitHub上的很多人的帮助下,我遇到了同样的问题,并且能够解决它。

本质上,网络核心使用底层操作系统来处理http调用。以前,在Linux上使用过libCurl,但是较新的SocketsHttpHandler使用gss,而后者没有ntlm支持(至少不在'microsoft / dotnet:2.2-aspnetcore-runtime-stretch-slim'映像中)。

要解决此问题,您需要使用docker文件在容器中安装一个额外的库。之后

从Microsoft / dotnet:2.2-aspnetcore-runtime-stretch-slim

(或您使用的任何图像)

在下一行添加以下内容:

运行apt-get更新&& apt-get安装-y --no-install-推荐apt-utils gss-ntlmssp

希望这会有所帮助!