我正在尝试通过c#应用程序连接到第三方SOAP服务.在Windows计算机上运行应用程序时,以下代码有效:var ws = new MyWebServiceClient();ws.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCred...
我正在尝试通过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客户端
如MSDN和here所述,
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).
本文标题为:在Linux机器上运行C#应用程序时,SOAP身份验证失败
基础教程推荐
- c# – Windows Phone 8通知和后台任务 2023-09-20
- 记一次.Net Core通过GDI+在CentOS 7(Docker)环境中绘图报错The type initializer for 'Gdip' threw an excepti 2023-09-27
- C#接口在派生类和外部类中的调用方法示例 2022-10-27
- 详解WCF服务中的svc文件 2023-05-25
- 如何优雅的利用Windows服务来部署ASP.NET Core程序 2023-09-28
- 在C#程序中注入恶意DLL的方法详解 2023-07-04
- c# – 将数据库上下文传递给静态方法 2023-11-24
- c# – 如何在Windows安装程序中为WinForms应用程序获取用户输入? 2023-09-20
- C#单例类的实现方法 2023-01-22
- C#中多种高效定时器方法的使用详解 2023-07-18