2011-10-10 63 views
0

我想与我无法控制的Java Web服务进行通信,并且尝试创建一个可以工作的绑定。使用WCF将WS-Security凭据添加到SOAP标头

  1. 时间戳没有在头允许的,所以为了使用includeTimestamp="false"属性,我必须使用一个<customBinding>
  2. 他们使用MTOM,所以我必须使用<mtomMessagingEncoding>元素。

这里是我的<bindings>元素:

<bindings> 
    <customBinding > 
    <binding name="MyBindingName" > 
     <mtomMessageEncoding /> 
     <transactionFlow /> 
     <security authenticationMode="UserNameOverTransport" 
       includeTimestamp="false">    
     </security> 
    </binding> 
    </customBinding> 
</bindings> 

的SOAP Web服务需要邮件标题采用以下格式:

<soap:Envelope ... > 
    <soap:Header ... > 
    <wsse:UsernameToken> 
     <wsse:Username>doo</wsse:Username> 
     <wsse:Password Type="wsse:PasswordText">fuss</wsse:Password> 
    </...> 
    </...> 
</...> 

我来最接近的是:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
      xmlns:a="http://www.w3.org/2005/08/addressing" 
      xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1"></a:Action> 
    <a:MessageID>urn:uuid:a368e205-a14d-4955-bf75-049cdd3a78c0</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    <a:To s:mustUnderstand="1">https://blablabla</a:To> 
    <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-0f1e399b-31a8-4e00-a57f-277c21e94879-1"> 
     <o:Username><!-- Removed--></o:Username> 
     <o:Password><!-- Removed--></o:Password> 
    </o:UsernameToken> 
    </o:Security> 
</s:Header> 

我确定我错过了什么这里的琐碎和愚蠢,但对于我的生活,我无法弄清楚它可能是什么。

+0

当您使用“添加服务参考”时会发生什么? –

+0

@JohnSaunders - 我确实使用了“添加服务引用”,但WSDL不包含任何ws安全信息。 –

+2

令人惊讶的是,没有得到WSDL的组织的数量意味着要描述该服务。这有什么解释吗?就像,也许安全是由服务之外的东西实现的? –

回答

5

还必须配置消息的版本,因为在默认情况下它使用的WS-Addressing:不需要

<bindings> 
    <customBinding > 
    <binding name="MyBindingName" > 
     <mtomMessageEncoding messageVersion="Soap11" /> <!-- or Soap12 --> 
     <security authenticationMode="UserNameOverTransport" 
       includeTimestamp="false">    
     </security> 
    </binding> 
    </customBinding> 
</bindings> 

TransactionFlow元素可言。

Btw。您显示的消息不是WS-Security令牌的有效使用,因为它必须位于Security元素内部,所以如果它确实是Java服务期望的内容,那么它不符合WS-Security规范,您将不得不使用自定义消息头。

+0

因此,如果我理解正确,元素应具有父级(根据规范)?如果是这样,我可以让他们改变他们的实施。我在哪里可以找到这方面的参考? –

+0

...实施了您的更改,并且按预期工作 - 正如您所说,我会看到元素。我会和Java帅哥谈谈,看看他们是否不能纠正。谢谢! –