Добавление учетных данных WS-Security в заголовки SOAP с использованием WCF - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь связаться с веб-сервисом Java, который я не могу контролировать, и пытаюсь создать привязку, которая будет работать.

  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 требуется, чтобы заголовок сообщения имел следующий формат:

 <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>

Я уверен, что мне здесь не хватает чего-то тривиального и глупого, но я не могу понять, что это может быть за жизнь.

1 Ответ

5 голосов
/ 11 октября 2011

Вы также должны настроить версию сообщения, потому что по умолчанию она использует 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, и вместо этого вам придется использовать собственный заголовок сообщения .

...