2013-04-20 74 views
2

我有一个使用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)似乎并不在微软的帮助文章/教程被引用。我在吠叫正确的树吗?

+0

'TransportCredentialOnly'仅适用于'BasicHttpBinding'。它是[BasicHttpSecurityMode枚举](http://msdn.microsoft.com/en-us/library/system.servicemodel)的一部分。basichttpsecuritymode.aspx),但他们没有很多信息。 – Tim 2013-04-20 07:08:22

+0

从上面的链接:“这种模式不提供消息的完整性和机密性,它只提供基于HTTP的客户端身份验证,请谨慎使用此模式,应该用于通过其他方式提供传输安全性的环境中(例如作为IPSec),并且只有Windows Communication Foundation(WCF)基础结构提供客户端身份验证。“ – Tim 2013-04-20 07:10:09

+0

也看看这个SO回答 - http://stackoverflow.com/a/1546086/745969 – Tim 2013-04-20 07:12:53

回答

2

的解决方案,在我的情况下,竟然被设置安全模式“TransportCredentialOnly”,像这样:

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Basic" proxyCredentialType="None" 
     realm="" /> 
    <message clientCredentialType="UserName" algorithmSuite="Default" /> 
</security> 

感谢evgenyl为促使我开我对其他安全模式的研究;但最终,它只是“TransportCredentialOnly”,而不是“消息”,这是诀窍。

1

您收到此错误,因为“交通”安全模式假设HTTPS。您可以使用消息安全模式。看到这个职位的详细信息:http://msdn.microsoft.com/en-us/library/ms733137.aspx

+0

非常感谢您回复,evgenyl。我尝试将安全模式更改为“消息”,如下所示: – Marcoid 2013-04-20 05:55:35

+0

Marcoid 2013-04-20 05:57:08

+0

...但我得到此异常:“System.InvalidOperationException:BasicHttp绑定要求BasicHttpBinding.Security.Message.ClientCredentialType与安全邮件的BasicHttpMessageCredentialType.Certificate凭证类型相同。为UserName凭证选择Transport或TransportWithMessageCredential安全性。 – Marcoid 2013-04-20 05:57:43