加密WCF消息密码

时间:2013-01-04 22:07:22

标签: c# wcf web-services security

负责开发基于Java的Web服务的第三方回到我们这里,要求消息头需要如下所示:

<soapenv:Header>
 <wsse:Security>
     <xenc:ReferenceList>
        <xenc:DataReference URI="#EncDataId-1"/>
     </xenc:ReferenceList>
     <wsse:UsernameToken>
        <wsse:Username>[snip]</wsse:Username>
        <xenc:EncryptedData Id="EncDataId-1" Type="http://www.w3.org/2001/04/xmlenc#Element">
           <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
           <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
              <ds:KeyName>[snip]</ds:KeyName>
           </ds:KeyInfo>
           <xenc:CipherData>
              <xenc:CipherValue>[snip]</xenc:CipherValue>
           </xenc:CipherData>
        </xenc:EncryptedData>
     </wsse:UsernameToken>
  </wsse:Security>
</soapenv:Header>

鉴于我对这种安全巫术魔法的非常了解,我无法弄清楚如何配置我的客户端来生成这样的标题。现在我的代码看起来像这样:

client.ClientCredentials.UserName.UserName = "[snip]";
client.ClientCredentials.UserName.Password = "[snip]";

和标题:

<s:Header>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <o:UsernameToken u:Id="uuid-e906a1ca-aa63-474c-b4ac-cf9b90ab2435-1">
            <o:Username>[snip]</o:Username>
            <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">[snip]</o:Password>
        </o:UsernameToken>
    </o:Security>
</s:Header>

和绑定:

<binding name="SMSSoap11">
    <security mode="TransportWithMessageCredential" />
</binding>

1 个答案:

答案 0 :(得分:1)

WCF不会为您生成此输出。您必须为此编写your own token,甚至可能更多。 WCF仅支持带有普通密码的用户名令牌,您的代码示例甚至看起来不像用户名令牌规范的任何部分。如果目标是使用加密密码和WS-Security,则安全标头似乎不完整。

您应该向Java开发人员询问WS-SecurityPolicy的安全要求是什么?