在 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运行相同的代码,它将失败:

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

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

有没有人看到 .NET Core 出现类似问题或找到解决方法?

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

假设问题报告是错误的,并且问题仍然存在于.NET core的Linux/Mac发行版中,有谁知道我如何获得该文章中建议的CredentialCache解决方法,使用SOAP客户端?我对 .NET 很陌生,对 .NETsoap 客户端也很陌生,所以如果这是一个幼稚的问题,我深表歉意。

似乎,对于非Windows,.NET核心在协商失败后无法尝试NTLM。 我知道,从python应用程序中,NTLM可以与这个特定的SOAP服务一起使用。如何强制它跳过"协商"并直接转到 NTLM?似乎这就是上述文章中CredentialCache解决方法正在做的事情。 我只是不知道如何与 SOAP 服务一起工作......

.Net Core SOAP 客户端,具有 NTLM 身份验证和凭据缓存

如 MSDN 和此处所述,

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 中修复的错误

正如这里已经遇到并在此处修复为错误的那样,它应该适用于 .net core 2.1(未发布并计划于 2018 年第一季度发布)。 所以现在,您应该在从 Linux 连接时使用另一种类型的身份验证(查看RuntimeInformation.IsOSPlatform)。

了解身份验证在 Windows/控制台应用程序与 Web 应用程序中的工作方式如何不同非常重要。

要跳过协商(从服务器)的问题的答案: 转到 IIS --> 转到站点/应用程序 --> 选择身份验证(双击)--> 您将在此处看到选项 --> 在 Windows 身份验证(如果已启用)下,>然后单击右侧操作窗格中的提供程序。

在这里,您可以向上移动/删除"协商"选项。

最新更新