在Linux机器上运行C#应用程序时,SOAP身份验证失败

我正在尝试通过c#应用程序连接到第三方SOAP服务.在Windows计算机上运行应用程序时,以下代码有效:

var ws = new MyWebServiceClient();
ws.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("myusername", "mypassword", "mydomain");
var response = ws.SomeEndpoint();
Element xmlResult = response.Result.SomeEndpoint;
...

但是,如果我从Linux或Mac OS运行相同的代码,它将失败并显示:

客户端身份验证方案“协商”未授权HTTP请求.从服务器收到的身份验证标头是“协商,NTLM”.

我有一个python应用程序,可以在任何操作系统上运行时使用相同的SOAP服务,而不会遇到问题,因此问题不在我的linux发行版/安装程序中.

是否有人看到过.NET core的类似问题或找到了解决方法?

我发现this issue report表明早期版本的.NET Core具有局限性/错误,可能会导致行为类似于我所看到的行为,但它声称这些问题在RC2之后得以解决.

假设问题报告是错误的,并且问题仍然存在于.NET Core的Linux / Mac发行版中,是否有人知道如何获得该文章中建议的CredentialCache解决方法,并且可以与SOAP客户端一起使用?我对.NET非常陌生,而对.NET soap客户端超级陌生,因此,如果这是一个天真的问题,我深表歉意.

看来,对于非Windows系统,.net核心在协商失败后无法尝试NTLM.我从python应用程序知道NTLM可以使用此特定的SOAP服务.如何强制它跳过“协商”并直接进入NTLM?似乎就是以上文章中的CredentialCache解决方法正在执行的操作.我只是不知道如何使它与SOAP服务一起使用…

最佳答案
具有NTLM身份验证和CredentialCache的.Net Core SOAP客户端

MSDNhere所述,

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();

basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;

basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

EndpointAddress endpoint = new EndpointAddress("http://myservice");

var factory = new ChannelFactory<IMyService>(basicHttpBinding, endpoint);
CredentialCache myCredentialCache = new CredentialCache();

NetworkCredential myCreds = new NetworkCredential("username", "password", "domain");
myCredentialCache.Add("ContoscoMail", 45, "NTLM", myCreds);
factory.Credentials.Windows.ClientCredential = 
         myCredentialCache.GetCredential("ContosoMail", 45, "NTLM");

var client = factory.CreateChannel(); 

// ... use the webservice

更新:这是在2.1中修复的错误

正如已经遇到的here并已修复为bug here一样,它应与.net core 2.1(未发布且计划于Q1 2018)一起使用.
因此,现在,从Linux连接时,您应该尝试使用另一种身份验证(请参阅RuntimeInformation.IsOSPlatform).

转载注明原文:在Linux机器上运行C#应用程序时,SOAP身份验证失败 - 代码日志