我需要在WCF中确保像这样的soap标头:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
<wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="CertId-1D82AB9733B359236712457035776561"></wsse:BinarySecurityToken>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-2">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#Timestamp-1">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms> <ds:DigestMethodAlgorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>
</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#id-3">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>
</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
</ds:SignatureValue>
<ds:KeyInfo Id="KeyId-1D82AB9733B359236712457035776562">
<wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-1D82AB9733B359236712457035776563">
<wsse:Reference URI="#CertId-1D82AB9733B359236712457035776561" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-1">
<wsu:Created>2009-06-22T20:46:17Z
</wsu:Created>
<wsu:Expires>2009-06-22T20:51:17Z
</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</SOAP-ENV:Header>
其中时间戳和正文部分/元素将通过消息(BinarySecurityToken)中包含的直接引用的证书进行数字签名,并且仅在传输级别通过SSL(IIS托管服务)确保机密性。目前Iam使用类TransportSecurityBindingElement和HttpsTransportBinding,但我不能像我想要的那样获得soap头...问题是(根据消息跟踪),在BinarySecurityToken元素中缺少像id,EncodingType,ValueType和message body这样的属性签名(我将ProtectionLevel设置为登录合同)
所以,如果有人掌握这方面的技能,我将非常感激。
答案 0 :(得分:1)
这是一个黑暗的镜头,因为我不知道任何WCF,但我确实知道SOAP消息签名。
必需品是SOAP body元素中的属性“Id”或“wsu:Id”。签名将使用该Id作为要签名的数据的引用。在您发布的示例中,这是在wsu:Timestamp元素上完成的 - 它的id为
wsu:Id="Timestamp-1"
然后签名使用它作为参考:
<ds:Reference URI="#Timestamp-1">
在示例中签名也引用:
<ds:Reference URI="#id-3">
我认为,这是示例正文的id。
我不确定你的工具包的API如何附加ID,但你肯定会在你签名的任何内容上使用它。
EncodingType和ValueType有点棘手。我担心我不知道那个问题。我的诱惑是尝试让Ids正确,然后看看它是否全部落到了位置。它可能会。