4

我正在尝试连接到需要 SSL 安全性和用户名/密码凭据的第三方 SOAP 1.1 服务。预期的一个例子是:

<soapenv:Header>
    <wsse:Security>
        <wsse:UsernameToken>
            <wsse:Username>username</wsse:Username>
            <wsse:Password>password</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

我的客户端配置如下:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="thirdpartyservicebindingconfig">
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName"
                             algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://..." 
                  binding="basicHttpBinding"
                  bindingConfiguration="thirdpartyservicebindingconfig"
                  contract="thirdpartyservicecontract" 
                  name="thirdpartyserviceendpoint" />
    </client>
</system.serviceModel>

服务客户端代码为:

var client = new thirdpartyservicecontractclient();

client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";

var result = client.DoSomething();

我收到以下故障异常消息:

安全处理器无法在邮件中找到安全标头。这可能是因为消息是不安全的错误,或者是因为通信双方之间存在绑定不匹配。如果为安全配置了服务并且客户端未使用安全性,则可能会发生这种情况。

编辑:
如果我将安全模式重新配置为“传输”:
<security mode="TransportWithMessageCredential">
我收到来自第三方服务的错误:

com.sun.xml.wss.XWSSecurityException: 消息不符合配置的策略 [AuthenticationTokenPolicy(S)]: No Security Header found; 嵌套异常是 com.sun.xml.wss.XWSSecurityException:com.sun.xml.wss.XWSSecurityException:消息不符合配置的策略 [AuthenticationTokenPolicy(S)]:未找到安全标头。

如何配置我的客户端以连接到此服务?

  • WS Security 通过 SSL 使用纯文本密码
4

1 回答 1

5

碰巧里克·斯特拉尔也遇到了同样的问题。这是他描述和解决问题的博客文章的链接。

问题:

问题是 WCF 在响应中需要一个 TimeStamp Soap 标头。如果您查看出站响应和 Soap 标头,您会发现那里有一个时间戳。时间戳预计将在返回 Soap 响应中返回。请注意,这不是 WS-Security 的要求,因此 WCF 在这里做了一些“特殊”的事情,实际上是中断了这个服务调用。

解决方案:

BindingElementCollection elements = client.Endpoint.Binding.CreateBindingElements();
elements.Find<SecurityBindingElement>().IncludeTimestamp = false;
client.Endpoint.Binding = new CustomBinding(elements);

上面的代码通过从出站调用中显式删除时间戳来修改绑定配置,从而消除了服务器返回它的要求。这让 WCF 很高兴,并且电话通过了。

于 2012-08-19T16:51:52.083 回答