在Linux机器上运行c#app时,SOAP身份验证失败

时间:2018-03-06 01:17:13

标签: c# linux .net-core soap-client

我正在尝试通过c#app连接到第三方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运行相同的代码,它将失败:

The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate, NTLM'.

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

有没有人在.NET核心中遇到类似问题或找到了解决方法?

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

假设问题报告错误并且问题仍然存在于.NET核心的Linux / Mac版本中,是否有人知道如何获得CredentialCache解决方法在那篇文章中建议使用 SOAP 客户端?我是.NET和超级 .NET soap客户端的新手,所以我道歉如果这是一个天真的问题。

似乎对于非Windows,.NET核心在协商失败后无法尝试NTLM。我知道,从python应用程序,NTLM使用这个特定的SOAP服务。 如何强制它跳过“Negotiate”并直接进入NTLM?看来这就是上面文章中CredentialCache解决方法正在做的事情。我只是无法弄清楚如何使用SOAP服务...

2 个答案:

答案 0 :(得分:2)

.Net Core SOAP客户端,具有NTLM身份验证和CredentialCache

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并修复为错误here,它应该与.net核心2.1一起使用(未发布并安排为Q1 2018)。 所以现在,从Linux连接时应该尝试使用其他类型的身份验证(查看RuntimeInformation.IsOSPlatform)。

答案 1 :(得分:1)

了解身份验证在Windows / Console应用程序VS Web应用程序中的工作方式非常重要。

您的问题的答案,以跳过谈判(从服务器):转到IIS - &gt;转到网站/应用程序 - &gt;选择身份验证(双击它) - &gt;你会在这里看到选项 - &gt;在Windows身份验证下(如果已启用),则 - &gt;点击右侧动作平移中的提供商。

您可以在这里向上移动/删除“谈判”选项。