在Linux机器上运行ac#app时,SOAP身份validation失败
我正在尝试通过ac#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核心的类似问题或找到了解决方法?
我发现这个问题报告表明早期版本的.NET核心存在限制/错误,可能导致类似于我所看到的行为,但它声称这些问题在RC2之后得到了解决。
假设问题报告是错误的并且问题仍然存在于.NET核心的Linux / Mac发行版中,是否有人知道我如何获得CredentialCache
解决方法,在该文章中建议使用SOAP客户端? 我是.NET的新手,也是.NET soap客户的新手,所以如果这是一个天真的问题我会道歉。
看来,对于非Windows,.NET核心在协商失败后无法尝试NTLM。 我知道,从python应用程序,NTLM使用这个特定的SOAP服务。 如何强制它跳过“谈判”并直接进入NTLM? 从上面的文章中可以看出,这就是CredentialCache
解决方法。 我只是无法弄清楚如何使用SOAP服务…
.Net Core SOAP客户端,具有NTLM身份validation和CredentialCache
如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(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中修复的错误
正如这里已经遇到的并且在这里修复了一个bug,它应该与.net core 2.1一起使用(未发布并计划在2018年第一季度使用 )。 所以现在,从Linux连接时应该尝试使用其他类型的身份validation(查看RuntimeInformation.IsOSPlatform
)。
了解身份validation在Windows / Console应用程序VS Web应用程序中的工作方式非常重要。
您的问题的答案跳过谈判(从服务器):转到IIS – >转到站点/应用程序 – >选择身份validation(双击它) – >您将在此处看到选项 – >在Windows身份validation下(如果这已启用)然后 – >单击右侧操作盘中的提供程序。
在这里,您可以向上移动/删除“谈判”选项。
- 如何通过分配新的Collection来更新Many-Many中的Collection?
- 如何将AcquireTokenAsync中收到的令牌与Active Directory一起存储
- 忽略错误的证书 – .NET CORE
- 无法加载文件或程序集Microsoft.Extensions.DependencyInjection.Abstractions,Version = 1.1.0.0
- 运行`serviceProvider.GetService ();`时,.Net core 2.0控制台程序得到空值。
- HttpClient中“服务器返回无效或无法识别的响应”的含义
- 在.NET Core中使用Reflection
- 程序’ dotnet.exe’已退出,代码为-2147450749
- 如何在ASP.NET Core中启用跟踪日志记录?