我有一个WCF SOAP服务,它使用许可信息进行响应。客户端将保存SOAP响应,并在每次程序加载、验证用户未通过过期日期等情况下加载SOAP响应。因此,响应的要求之一是有一个签名,以便客户端可以通过某种加密算法运行数据,并根据发送的签名检查结果,以验证文件中没有任何更改。这不是什么新鲜事,这是XML签名。但是,服务是用DataContractSerializer编写的,所以我不能只获取数据,创建一个XML签名,并将其直接注入SOAP响应中。
我知道WsHttpBinding有一些安全特性,MSDN上的WS-安全页面描述了Ws绑定协议WRT到SOAP的能力.
标识与消息相关的实体。 证明实体具有正确的组成员资格。 证明实体具有正确的访问权限集。 证明消息没有改变.
但我不知道最后那部分是怎么做的。看看我在WsHttpBinding上得到的SOAP响应,我看到了CipherData和CipherValue,但是研究让我相信这更多的是与实际的消息加密有关,而不是内容验证。我看到了一些类似于ValidateResponse和ValidateResult的东西,但这些空间看起来像是另一个端点用来验证信息的空间,一旦文件从这个服务中获得,这个产品就需要在没有连接到internet的设备上工作。
我知道理论上我可以把所有的数据放到一个变量中,然后SHA256它并告诉我的客户去做同样的过程,但这是肮脏的,非常不规范的。我觉得SOAP响应应该有相当于XML签名的签名,但通过搜索找不到任何东西。
发布于 2013-10-09 17:35:38
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
https://stackoverflow.com/questions/19277145
复制相似问题