C# 加密WCF消息密码
负责开发基于Java的Web服务的第三方回到我们这里,要求消息头必须如下所示:C# 加密WCF消息密码,c#,wcf,web-services,security,C#,Wcf,Web Services,Security,负责开发基于Java的Web服务的第三方回到我们这里,要求消息头必须如下所示: <soapenv:Header> <wsse:Security> <xenc:ReferenceList> <xenc:DataReference URI="#EncDataId-1"/> </xenc:ReferenceList> <wsse:UsernameToken> <
<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>
WCF不会为您生成此输出。你将不得不为此而写,甚至可能更多。WCF只支持带有现成密码的用户名令牌,您的代码示例甚至与用户名令牌规范的任何部分都不一样。如果目标是在WS-Security中使用加密密码,那么安全标头似乎不完整
您应该询问Java开发人员WS-SecurityPolicy的安全要求是什么?您可以发布当前SOAP信封的外观吗?你可以使用像Fiddler这样的工具来捕捉它。他们需要它与他们的格式有多接近,因为默认格式有很大的不同(例如,标记名不同)。如果您需要确切的标记名,那么您需要创建自己的消息格式化程序。这里有一篇文章描述了如何做到这一点:如果他们的需求具有一定的灵活性,那么您可能不必走那么远,但我的直觉告诉我,这正是您需要做的。@Pete我已经用当前标题更新了我的问题。我有一种感觉,这将需要一个自定义的解决方案,但也许然后我可以推回到他们带回旧的安全标题。我有一种感觉,这是情况,但不能支持它自己。你的回答使我有信心推回这个要求。