我有一个响应许可信息的WCF SOAP服务。客户端将保存SOAP响应并在每次加载程序时加载它,验证用户未通过截止日期等。因此,响应的一个要求是具有签名,以便客户端可以运行数据通过一些加密算法,并根据发送的签名检查结果,以验证文件没有任何变化。这不是什么新鲜事,这是XML signing。但是,该服务是使用DataContractSerializer编写的,因此我不能只获取数据,创建XML签名,并将其直接注入SOAP响应。
我知道WsHttpBinding有一些安全功能,MSDN上的WS-Security page将Ws绑定协议WRT描述为SOAP,因为它具有...
识别与消息有关的实体。
证明实体具有正确的组成员资格。
证明实体拥有正确的访问权限。
证明邮件未更改。
但我无法确切地知道最后一部分是如何做到的。看看我在WsHttpBinding上获得的SOAP响应,我看到了CipherData和CipherValue,但是研究使我相信这更多地与实际的消息加密有关,而不是内容验证。我看到类似于ValidateResponse和ValidateResult的内容,但这些内容看起来像另一个端点的空间来验证信息,并且该产品需要在从该服务获取文件后才能在未连接到互联网的设备上工作。
我知道理论上我可以将所有数据放入变量和SHA256中并告诉我的客户端执行相同的过程,但这很脏且非标准化。我觉得应该有一个等同于SOAP响应的XML签名,但我找不到任何通过搜索。
答案 0 :(得分: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