类型属性

时间:2015-12-15 12:10:45

标签: c# xml web-services soap ws-security

我使用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。

1 个答案:

答案 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)更难编写自定义序列化程序,以便更正用户名令牌   这种行为。

线程后面有一个串行器的例子。