我有一个使用 Web 服务的 VB.NET (2008) 控制台应用程序。我最初开始使用旧的/遗留的(WCF 之前)技术来编写它,即使用 WSDL.exe(或 Visual Studio 中的“添加 Web 服务”)导入 WSDL,该技术基于 System.Web.Services.Protocols.SoapHttpClientProtocol 创建类。然而,我很快意识到这不是最好的方法(感谢 John Saunders 在我上一个问题中的评论 - How to get serialized XML of object passed to web service? )。
所以,我现在已经将代码转换为 WCF(使用“添加服务引用”,它创建基于 System.ServiceModel.ClientBase 的类);它的工作原理或多或少相同,除了一个关键点:安全性。
我正在使用的 Web 服务是用 Java 编写的;虽然我们(我和开发 Web 服务的团队)都在同一家公司工作,但我对他们如何发布和公开 Web 服务并没有太多控制权。他们的要求是我通过 HTTP(而不是 HTTPS)传递用户名和密码(基本 HTTP 身份验证)。我知道这不是最安全的方法;但这是一场我现在无法参加的战斗。
使用旧方法效果很好。但如果我尝试通过在 app.config 中设置 WCF 来执行此操作:
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
...并在如下代码中设置用户名和密码:
oServiceClient.ClientCredentials.UserName.UserName = "SomeUsername"
oServiceClient.ClientCredentials.UserName.Password = "SomePassword"
我有礼貌地向我抛出了这个异常:
System.ArgumentException: The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via
这太糟糕了;在 .NET 3.5 中搜索 StackOverflow 和其他站点并没有发现太多解决此问题的方法。我发现了我认为可能有希望的东西( http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html );然而,看起来这个解决方案需要在服务端和客户端上进行配置更改。正如前面提到的,我对此的服务器端没有任何控制权。
有没有办法使用基于 WCF 的客户端来完成此任务?还是我需要放弃并回到老路?
编辑:我似乎在这方面取得了一些成功:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
<message clientCredentialType="UserName" />
</security>
但是微软帮助文章/教程中似乎没有引用这种安全模式(TransportCredentialOnly)。我对树吠叫了吗?
最佳答案
就我而言,解决方案是将安全模式设置为“TransportCredentialOnly”,如下所示:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
感谢 evgenyl 促使我向其他安全模式开放我的研究;但最终,是“TransportCredentialOnly”而不是“Message”成功了。
关于.net - 通过 HTTP 将用户名和密码以明文形式发送到 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16116211/