3

我需要在 WCF 中确保这样的肥皂标题:

<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 托管服务)的传输级别上确保机密性。目前我正在使用类 TransportSecurityBindingElement 和 HttpsTransportBinding,但是我无法获得我想要的肥皂头......问题是(根据消息跟踪)BinarySecurityToken 元素中缺少 id、EncodingType、ValueType 和消息正文等属性已签署(我将 ProtectionLevel 设置为签署合同)

因此,如果有人有这方面的技能,我将非常感激。

4

1 回答 1

1

这是在黑暗中拍摄的,因为我不知道任何 WCF,但我知道 SOAP 消息签名。

必须具备的是 SOAP 主体元素中的属性“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 正确,然后看看它是否全部到位。它可能。

于 2009-10-28T18:09:59.783 回答