C# 在linux上从.NET内核使用NTLM auth调用WCF服务

C# 在linux上从.NET内核使用NTLM auth调用WCF服务,c#,linux,wcf,.net-core,ntlm,C#,Linux,Wcf,.net Core,Ntlm,我无法使用运行在linux box(docker容器)上的.NET Core的NTLM身份验证成功调用WCF服务。 不过,同样的代码在Windows10上也能完美运行 我所做的: 将此添加到ConfigureServices: AppContext.SetSwitch(“System.Net.Http.UseSocketsHttpHandler”,false); 运行apt get-y安装gss ntlmssp 这是调用服务之前的代码: var client=new WcfServic

我无法使用运行在linux box(docker容器)上的.NET Core的NTLM身份验证成功调用WCF服务。 不过,同样的代码在Windows10上也能完美运行

我所做的:

  • 将此添加到
    ConfigureServices
AppContext.SetSwitch(“System.Net.Http.UseSocketsHttpHandler”,false);
  • 运行apt get-y安装gss ntlmssp
  • 这是调用服务之前的代码:
var client=new WcfServiceSoapClient();
client.Endpoint.Address=新的端点地址(settings.Uri);
client.ClientCredentials.Windows.AllowedImpersonationLevel=TokenImpersonationLevel.Impersonation;
client.ClientCredentials.Windows.ClientCredential=新网络凭据
{
Domain=settings.Domain,
用户名=设置。用户名,
密码=设置。密码
};
var binding=(BasicHttpBinding)client.Endpoint.binding;
binding.Security.Transport.ClientCredentialType=HttpClientCredentialType.Ntlm;
binding.Security.Transport.ProxyCredentialType=HttpProxyCredentialType.Ntlm;
如前所述,这在Windows10上运行良好。在Linux上,会记录以下错误:

System.ServiceModel.Security.MessageSecurityException:HTTP请求未经客户端身份验证方案“Ntlm”授权。从服务器接收的身份验证标头为“NTLM,协商”。
在System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult结果)
位于System.ServiceModel.Channel.ServiceChannel.SendAsyncResult.End(SendAsyncResult)
位于System.ServiceModel.Channels.ServiceChannel.EndCall(字符串操作,对象[]输出,IAsyncResult结果)
在System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.c\uu DisplayClass1\u 0.b\uu 0(IAsyncResult asyncResult)

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

我发现,如果我们在服务器端的Windows身份验证中删除协商提供程序,无论采用哪种调用方式,该项目都会工作。

Netframework似乎会自动协商身份验证方式,Core无法,这应该是一个bug。

如果有什么我可以帮忙的,请随时告诉我。

我也遇到了同样的问题,并且在net core GitHub上的很多人的帮助下得以解决

本质上,NetCore使用底层操作系统来处理http调用。以前,Linux上使用了libCurl,但较新的SocketsHttpHandler使用gss,gss不支持ntlm(至少在“microsoft/dotnet:2.2-aspnetcore-runtime-stretch-slim”映像中不支持)

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

来自microsoft/dotnet:2.2-aspnetcore-runtime-stretch-slim

(或您使用的任何图像)

在下一行添加以下内容:

运行apt get update&&apt get install-y——无安装建议apt utils gss ntlmssp


希望这有帮助

服务器使用哪种绑定,是否使用Microsoft wcf web服务引用提供程序生成客户端代理类?您是否尝试使用ChannelFactory呼叫该服务@在添加连接服务时,我在VS2019中使用了一个生成的WSDL文件,该文件是由WCF服务的开发人员交给我的。我没有使用ChannelFactory,因为我没有VS WCF工具生成的接口。我设法使用了ChannelFactory(因为没有“I”后缀,所以没有看到接口),但是我在Linux上遇到了相同的错误:
System.ServiceModel.Security.MessageSecurityException:HTTP请求未经客户端身份验证方案“Ntlm”授权。从服务器收到的身份验证标头是“NTLM,协商”。
最后我们切换到基本身份验证。谢谢你的回复。我在某个地方读到过,删除协商(甚至让NTLM优先)可以修复所有问题,但不幸的是,在我们的案例中,这不起作用。在我这方面,只有删除协商提供程序才能使它起作用。似乎我们应该确保双方的身份验证头是相同的。我问另一方(承载WCF服务)他们是否以这种方式删除了协商头,并得到了确认。所以不知什么原因,它仍然不起作用。不,不幸的是没有。我已经试过了,但是没有什么不同。我只是注意到您设置了AppContext.SetSwitch(“System.Net.Http.UseSocketsHttpHandler”,false),并且还添加了gss ntlmssp包。这似乎有些奇怪,因为gss ntlmssp是GSSAPI使用ntlm身份验证所必需的,但关闭SocketsHttpHandler将启用使用LibCurl而不是GSSAPI的CurlHandler。。。