【发布时间】:2011-12-15 01:31:55
【问题描述】:
我正在编写一个 .NET 客户端 (WCF),它将使用使用 Apache CXF (Java) 实现的 Web 服务,令人惊讶的是,让 WCF 设置 Type 属性非常困难Password 标记到 PasswordText。即我希望 SOAP 标头看起来像:
<wsse:Security soap:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-11" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>test</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">a287645857cfaaddf82e2d333651b3e0</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">oKGlwEkbkhYJH6upsbiqeQ==</wsse:Nonce>
<wsu:Created>2011-10-25T13:10:11.958Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
但实际的标题看起来像:
<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-5acb0b47-1b52-4535-bfaf-b9e76621b7eb-1">
<o:Username>test</o:Username>
<o:Password>a287645857cfaaddf82e2d333651b3e0</o:Password>
</o:UsernameToken>
</o:Security>
如您所见,Password 标记中缺少 Type 属性。网络上的一些研究似乎表明我可能必须编写一个拦截器来解决这个问题。我认为有一个简单的解决方案,即配置设置,可以解决这个问题,但也许没有。无论如何,我希望通过发布这个问题得到一些澄清。
WS 服务器拒绝请求,因为缺少 Type 属性。 BSP 规范的一些功能检查。合规性(不确定这是什么)引发异常。
问候,奥拉
【问题讨论】:
-
您是如何创建客户端的? “添加服务参考”
-
您还需要 Nonce 和 Created 吗? WCF 用户名令牌配置文件实现不提供它们,因此它会导致自定义令牌或自定义消息头。
-
是的,使用“添加服务引用”创建,然后对配置文件进行了一些调整。
标签: wcf soap ws-security usernametoken