Аутентификация имени пользователя WS-Security, взятого из области GlassFish, дает «Отказ в аутентификации» - PullRequest
3 голосов
/ 19 августа 2011

У меня есть веб-служба SOAP, объявленная с использованием @WebService в подпроекте EJB EAR, запущенного в GlassFish 3.1.1 с использованием встроенной среды выполнения Metro. Это было отмечено обычными @DeclareRoles и @RolesAllowed на уровне класса.

У меня есть дескриптор WSIT для аутентификации с использованием простого открытого текста-пароля UsernameToken.

В EAR glassfish-application.xml я указываю область как стандартную область файлов, которая поставляется с GlassFish. В эту сферу я добавил пользователя для тестирования, принадлежащего к определенной группе. Эта группа сопоставлена ​​с ролью, указанной мной в glassfish-ejb-jar.xml.

Я также включил Менеджер безопасности в GlassFish, а также аудит. Я перезапустил сервер после этого.

Я создал клиента и установил имя пользователя и пароль в обработчиках обратного вызова. Я регистрируюсь, чтобы удостовериться, что учетные данные действительно установлены. Я также попытался установить учетные данные следующим образом:

Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, "myUsername");
requestContext.put(BindingProvider.PASSWORD_PROPERTY, "myPassword");

Когда я звоню в службу, я получаю это на сервере:

INFO: SEC5046: Audit: Authentication refused for [myUsername].
INFO: SEC1201: Login failed for user: myUsername
SEVERE: WSS1408: UsernameToken Authentication Failed
SEVERE: WSITPVD0035: Error in Verifying Security in Inbound Message.
com.sun.xml.wss.impl.WssSoapFaultException: Authentication of Username Password Token Failed
    at com.sun.xml.ws.security.opt.impl.util.SOAPUtil.newSOAPFaultException(SOAPUtil.java:158)
    at com.sun.xml.ws.security.opt.impl.incoming.UsernameTokenHeader.validate(UsernameTokenHeader.java:164)
    at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.handleSecurityHeader(SecurityRecipient.java:341)
    at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.cacheHeaders(SecurityRecipient.java:275)
    at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.validateMessage(SecurityRecipient.java:225)
    at com.sun.xml.wss.provider.wsit.WSITServerAuthContext.verifyInboundMessage(WSITServerAuthContext.java:586)
    at com.sun.xml.wss.provider.wsit.WSITServerAuthContext.validateRequest(WSITServerAuthContext.java:360)
    at com.sun.xml.wss.provider.wsit.WSITServerAuthContext.validateRequest(WSITServerAuthContext.java:263)
    at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:173)
    at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:144)
    at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:641)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:600)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:482)
    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:314)
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:608)
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:259)
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:162)
    at org.glassfish.webservices.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:120)
    at org.glassfish.webservices.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:91)
    at org.glassfish.webservices.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:200)
    at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:131)
    (Rest is snipped away)

и я получаю это на клиенте:

Authentication of Username Password Token Failed
javax.xml.ws.soap.SOAPFaultException: Authentication of Username Password Token Failed
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:189)
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:189)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:122)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:140)

Затем я создал простой проект сервлета / JSP и добавил ограничение безопасности для области. В этом случае работает аутентификация с использованием того же пользователя.

Политика WS-Security выглядит следующим образом:

  <ns1:Policy xmlns:ns1="http://schemas.xmlsoap.org/ws/2004/09/policy" wsu:Id="MyServicePortBindingPolicy">
    <ns1:ExactlyOne>
      <ns1:All>
    <ns2:SupportingTokens xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
      <ns1:Policy>
        <ns1:ExactlyOne>
          <ns1:All>
        <ns2:UsernameToken ns2:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
          <ns1:Policy>
            <ns1:ExactlyOne>
              <ns1:All>
            <ns2:WssUsernameToken10 />
              </ns1:All>
            </ns1:ExactlyOne>
          </ns1:Policy>
        </ns2:UsernameToken>
          </ns1:All>
        </ns1:ExactlyOne>
      </ns1:Policy>
    </ns2:SupportingTokens>
    <ns3:UsingAddressing xmlns:ns3="http://www.w3.org/2006/05/addressing/wsdl" />
      </ns1:All>
    </ns1:ExactlyOne>
  </ns1:Policy>

Что здесь не так? Любые предложения высоко ценятся.

1 Ответ

1 голос
/ 22 августа 2011

Это решилось само собой, когда я отключил свой собственный механизм программной проверки подлинности, запеченный в домашних условиях, который вызвал разрушительное исключение. Не могу поверить, что меня не поразило раньше.

...