четверг, 3 июня 2010 г.

Oracle Service Bus and Siebel WS-Security UserNameToken

Аутентификация в вебсервисах Siebel может быть осуществлена несколькими способами. На практике я попробовал 2 из них:
1. Через передачу GET параметров. Выглядит ужасно и есть ощущение, что это несекурно даже через https.
2. Используя стандартный WS-Security. На ней и остановимся поподробнее.



Для аутентификации с использованием WS-Security нужно в заголовке SOAP передавать аутентификационные данные. Выглядит это таким образом:

<wsse:security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext">
    <wsse:usernametoken>
        <wsse:username>user</wsse:username>
        <wsse:password type="wsse:PasswordText">password</wsse:password>
    </wsse:usernametoken>
</wsse:security>

В Oracle Service Bus предусмотрен механизм для работы с Security Token. Для его использования нужно:

1. Создать policy. В нашем случае она выглядит как:

<wsp:policy wsu:id="WS-Policy-Siebel" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <wssp:identity xmlns:wssp="http://www.bea.com/wls90/security/policy">
        <wssp:supportedtokens>
            <wssp:securitytoken tokentype="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken">
                <wssp:usepassword type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"></wssp:usepassword>
            </wssp:securitytoken>
        </wssp:supportedtokens>
    </wssp:identity>
</wsp:policy>

2. Замапить её на вызываемый сервис на вкладке Policy конфигурации бизнес сервиса.
3. Создать Service Account с аутентификациооными данными и замапить его на появившейся вкладке Security BS.


Теперь при вызове сервиса в soap:head появляются необходимые аутентификационные данные:

<soapenv:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
    <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="unt_hzo9Xh2IiCqSYGaH">
        <wsse:Username>USERNAME</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
    </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

Казалось бы все должно работать, однако, по факту, появляется ошибка, которая говорит о том, что что-то не так с атрибутом mustUnderstand. Пусть это не вводит в заблуждение - как выясняется, версия WS-Security Siebel и OSB не совпадает и поэтому Siebel не принимает аутентификационные данные.

<Body>
  <Fault>
    <faultcode>SOAP-ENV:MustUnderstand</faultcode>
    <faultstring>Unable to process SOAP Header child element 'wsse:Security' with 'mustUnderstand="1"'((SBL-EAI-08000)</faultstring>
      <detail>
          <siebelf:siebdetail xmlns:siebelf="http://www.siebel.com/ws/fault">
          <siebelf:logfilename>EAIObjMgr_nld_0014_14680077.log</siebelf:logfilename>
          <siebelf:errorstack>
          <siebelf:error>
          <siebelf:errorcode>SBL-EAI-08000</siebelf:errorcode>
          <siebelf:errorsymbol/>
          <siebelf:errormsg>Unable to process SOAP Header child element 'wsse:Security' with 'mustUnderstand="1"'((SBL-EAI-08000)</siebelf:errormsg>
          </siebelf:error>
          </siebelf:errorstack>
          </siebelf:siebdetail>
      </detail>
    </Fault>
</Body>


Выход из этой ситуации состоит в ручном заполнении soap header-а. Данные для заполнения можно взять из xquery функции fn-bea:lookupBasicCredentials, которая возвращает аутентификационную информацию.

Более подробную статью по аналогичной проблеме я обнаружил в процессе написания этой. Смотрите.

Комментариев нет:

Отправить комментарий