2013-10-09 146 views
2

我有一个WCF SOAP服务,用许可信息进行响应。客户端将保存SOAP响应并在每次程序加载时加载它,验证用户没有通过过期日期等。因此,响应的一个要求是签名,以便客户端可以运行数据通过某种加密算法,并根据已发送的签名检查结果,以验证文件没有任何更改。这不是什么新鲜事,这是XML signing。但是,该服务是使用DataContractSerializer编写的,因此我不能只取数据,创建XML签名,然后直接将其注入到SOAP响应中。WCF wsHttpBinding和XML签名

我知道WsHttpBinding的有一些安全功能,在WS-Security page MSDN上介绍了WS协议WRT结合SOAP作为有能力... ...

确定参与该消息的实体。

证明实体具有正确的组成员资格。

证明实体具有正确的访问权限集合。

证明消息没有改变。

但我找不到它究竟如何做最后一部分。看看我用WsHttpBinding得到的SOAP响应,我看到了CipherData和CipherValue,但研究让我相信这更多的是与实际的消息加密有关,而不是内容验证。我看到类似ValidateResponse和ValidateResult的东西,但是这些看起来像是另一个端点验证信息的空间,并且一旦从该服务获取文件,此产品需要在未连接到互联网的设备上工作。

我知道我理论上可以把所有的数据放入一个变量中,然后告诉我的客户端执行相同的过程,但这很脏,非标准化。我觉得应该有与SOAP签名相同的SOAP响应,但我无法通过搜索找到任何东西。

+0

我怀疑它“证明该消息并未改变“因为否则它不能用你的密钥正确解密。 –

+0

这是不正确的。根据WS-Security规范。它确实在SOAP消息中包含适当的数字签名。 –

回答

3

wsHttpBinding支持WS-Security,它包含SOAP消息中的数字签名。要启用它,您需要使用ServiceContractAttribute.ProtectionLevel或在服务合同定义的OperationContractAttribute.ProtectionLevel,而不是在服务配置做它就像你所期望的

所以,你的服务合同:

[ServiceContract(ProtectionLevel=ProtectionLevel.EncryptAndSign)] 
    public interface IMyServiceThatIWantToEncyptAndSign 
    { 
    ... 
    } 

[ServiceContract(ProtectionLevel=ProtectionLevel.Sign)] 
    public interface IMyServiceThatIWantToSign 
    { 
    ... 
    } 

[OperationContract(ProtectionLevel=ProtectionLevel.EncryptAndSign)] 
string MyOperationThatIWantToEncryptAndSignSign(string msg); 

[OperationContract(ProtectionLevel=ProtectionLevel.Sign)] 
string MyOperationThatIWantToSign(string msg); 

它的默认值是ProtectionLevel.None这就是为什么我认为你没有看到任何签名。

相关的MSDN链接在这里为服务合同:

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.aspx

,并在这里为经营合同:

http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.aspx

+0

这工作!非常感谢! –

+0

好!我会删除免责声明; o) –