2011-10-10 68 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帥哥談談,看看他們是否不能糾正。謝謝! –