我有一个使用Web服务的VB.NET(2008)控制台应用程序。我最初开始使用在WSDL.exe(或Visual Studio中的“添加Web服务”)中导入WSDL的旧/旧版(WCF前)技术编写它,该技术基于System.Web.Services.Protocols.SoapHttpClientProtocol创建类。不过,我很快意识到,这不是最好的办法(感谢John Saunders在我之前的问题中的评论 - How to get serialized XML of object passed to web service?)。通过HTTP将用户名和密码以明文形式发送到Web服务
所以,我有我的代码转换结束了WCF(使用“添加服务引用”,创建基于System.ServiceModel.ClientBase类)来;它的作用差不多,除了一个关键点:安全。
我消耗是用Java编写的Web服务;尽管我们(我和开发Web服务的团队)都为同一家公司工作,但我对他们如何发布和公开Web服务并没有太多的控制权。他们的要求是我通过HTTP传递用户名&密码(基本HTTP身份验证),而不是 HTTPS。我知道这不是最安全的方式;但那是我现在无法战斗的战斗。
这用老办法效果很好。但是,如果我尝试在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'仅适用于'BasicHttpBinding'。它是[BasicHttpSecurityMode枚举](http://msdn.microsoft.com/en-us/library/system.servicemodel)的一部分。basichttpsecuritymode.aspx),但他们没有很多信息。 – Tim 2013-04-20 07:08:22
从上面的链接:“这种模式不提供消息的完整性和机密性,它只提供基于HTTP的客户端身份验证,请谨慎使用此模式,应该用于通过其他方式提供传输安全性的环境中(例如作为IPSec),并且只有Windows Communication Foundation(WCF)基础结构提供客户端身份验证。“ – Tim 2013-04-20 07:10:09
也看看这个SO回答 - http://stackoverflow.com/a/1546086/745969 – Tim 2013-04-20 07:12:53