我正在尝试通过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服务...
答案 0 :(得分:2)
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
已经遇到here并修复为错误here,它应该与.net核心2.1一起使用(未发布并安排为Q1 2018)。
所以现在,从Linux连接时应该尝试使用其他类型的身份验证(查看RuntimeInformation.IsOSPlatform
)。
答案 1 :(得分:1)
了解身份验证在Windows / Console应用程序VS Web应用程序中的工作方式非常重要。
您的问题的答案,以跳过谈判(从服务器):转到IIS - &gt;转到网站/应用程序 - &gt;选择身份验证(双击它) - &gt;你会在这里看到选项 - &gt;在Windows身份验证下(如果已启用),则 - &gt;点击右侧动作平移中的提供商。
您可以在这里向上移动/删除“谈判”选项。