在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客户端
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).
标签:net-core,soap-client,linux,c 来源: https://codeday.me/bug/20191109/2012506.html