我使用WS-Security向外部Web服务发出请求。从SoapUI表单一切正常。来自.Net(C#)它没有。
我发现请求中的差异是Security标头中Type属性的命名空间。
来自soapUI的标题包含:
<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-90bae2a1-88a9-4b4c-b84e-9244d3576051-7">
<o:Username>******</o:Username>
<o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">******</o:Password>
</o:UsernameToken>
</o:Security>
来自.net(C#),xml就像:
<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-90bae2a1-88a9-4b4c-b84e-9244d3576051-7">
<o:Username>******</o:Username>
<o:Password o:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">******</o:Password>
</o:UsernameToken>
</o:Security>
问题是服务器不接受密码元素的Type属性中的o:。
首先:服务器是否应该在Type属性中接受o:?
第二个(也是更重要的):有没有办法从Type属性中删除o:因为我无法控制web服务?
在C#中,我使用带有TransportWithMessageCredential安全模式的basicHttpBinding。
答案 0 :(得分:0)
来自8年前的a thread on Connect! - 引用相同的问题:
当我的应用程序服务器尝试验证时,它失败了 有关Password上Type属性的消息。存在的 名称空间声明似乎导致架构验证失败。
回复是:
遗憾的是,WCF生成令牌不正确。一个错误 提起此事。
您有几种解决方法
1)更容易设置
WSSecurityTokenSerializer.EmitsBspRequiredAttribute = false
。在这种情况下,这将完全取消Type属性 它默认为http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText。 这是您目前指定的内容,但您需要确定 服务期望默认,并且不需要指定任何其他内容。
2)更难编写自定义序列化程序,以便更正用户名令牌 这种行为。
线程后面有一个串行器的例子。