3

我们开发了一个带有 usernameToken 身份验证的 WCF4 服务,该服务正在被 Java/Axis 客户端(我们无法控制)使用。

我可以看到进来的请求的主体看起来像这样......

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <wss:Security xmlns:wss="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wss:UsernameToken>
        <wss:Username>username</wss:Username>
        <wss:Password>password</wss:Password>
      </wss:UsernameToken>
    </wss:Security>
  </soapenv:Header>
  <soapenv:Body>
    {snipped}
  </soapenv:Body>
</soapenv:Envelope>

我们返回的响应看起来像这样......

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <u:Timestamp u:Id="_0">
        <u:Created>2012-05-02T01:23:12.711Z</u:Created>
        <u:Expires>2012-05-02T01:28:12.711Z</u:Expires>
      </u:Timestamp>
    </o:Security>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    {snipped}
  </s:Body>
</s:Envelope>

问题是响应中的 s:mustUnderstand="1" 属性。这会在 Java/Axis 客户端中导致“必须理解检查失败”错误。

有谁知道如何配置 WCF 以删除此 s:mustUnderstand 属性或至少将其设置为“0”而不是“1”?

4

1 回答 1

1

我们想出的解决此互操作问题的解决方案是更改为自定义绑定并指定 includeTimestamp="false" 属性。通过这样做,时间戳(创建和过期)没有添加到响应中,因此整个安全标头消失了 - 包括导致所有问题的 mustUnderstand 属性。

<customBinding>
    <binding name="customBindingConfig">
        <security authenticationMode="UserNameOverTransport" includeTimestamp="false" />
         <textMessageEncoding messageVersion="Soap11" />
         <httpTransport />
   </binding>
</customBinding>

所以现在的响应看起来像这样......

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        {snipped}
    </s:Body>
</s:Envelope>
于 2012-05-24T00:50:36.953 回答