保护WCF服务

时间:2010-12-17 19:46:37

标签: wcf web-services

我正在尝试使用ProtectionLevel属性在WCF Web服务上设置安全性:

[ServiceContract(ProtectionLevel= ProtectionLevel.EncryptAndSign)]

这会编译,但是当我尝试更新另一个项目(同一解决方案)中的服务引用时,Visual Studio会抛出异常。

  

System.InvalidOperationException:The   请求消息必须受到保护。   这是操作所必需的   合约   ( 'IStorageService', 'tempuri.org/')。   必须由保护提供保护   捆绑   ( '的​​WSHttpBinding', 'tempuri.org/')。

我还需要设置什么才能让它发挥作用?

2 个答案:

答案 0 :(得分:7)

您的ServiceContract属性指定服务需要一个安全通道用于所有操作,消息签名(消息包含可以证明它未被篡改的数字签名)和消息加密(字节的消息在通过网络传输时被加密)。

您的客户端代码(即在调用服务的项目中)必须满足这些要求。如果此项目使用BasicHttpBinding和默认设置,则不会满足服务的要求(默认情况下,BasicHttpBinding禁用安全性)。如果您将客户端项目配置为使用WsHttpBinding,而使用其默认设置,则异常应该消失(此绑定默认启用EncryptAndSign)。

答案 1 :(得分:1)

ProtectionLevel是开发人员设置绑定必须遵守的最低级别的一种方式。部署服务时,配置中指定的实际绑定可能支持也可能不支持最低级别。例如,默认情况下,BasicHttpBinding类不提供安全性(尽管可以启用它)。因此,将其与具有除None之外的任何设置的契约一起使用将导致抛出异常。见here