Type属性的Web服务WS-Security命名空间

本文关键字:WS-Security 命名空间 服务 Web 属性 Type | 更新日期: 2023-09-27 18:26:54

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

问题是服务器不接受password元素的Type属性中的o:。

首先:服务器是否应该接受Type属性中的o:?

第二(也是更重要的):既然我不能控制Web服务,有没有办法从Type属性中删除o:?

在C#中,我使用带有TransportWithMessageCredential安全模式的basicHttpBinding。

Type属性的Web服务WS-Security命名空间

Connect上有一个8年前的线程!-它引用了相同的问题:

当我的应用程序服务器尝试对此进行验证时,它会失败,并返回关于"密码"上的"类型"属性的消息。存在命名空间声明似乎会导致架构验证失败。

答案是:

不幸的是,WCF生成令牌不正确。一个错误为此申请。

你有几个解决办法的选择

1) 更简单--设置WSSecurityTokenSerializer.EmitsBspRequiredAttribute = false。这将完全取消显示Type属性,在这种情况下它默认为

http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText.这是您当前指定的内容,但您需要确保服务需要默认值,不需要指定任何其他内容。

2) Harder——为Username令牌编写一个自定义序列化程序以进行更正这种行为。

稍后在线程中有一个序列化程序的示例。