Autenticación de clientes de servicios web con UsernameToken (señal de nombre de usuario)

WebSphere Application Server Liberty soporta la especificación OASIS Web Services Security UsernameToken Profile 1.1. La especificación describe cómo proporciona un cliente de servicios web una UsernameToken como medio para identificar al solicitante utilizando un nombre de usuario y, de manera opcional, utilizando una contraseña o un equivalente a contraseña con el proveedor de servicios web. El entorno de ejecución de seguridad de servicios Web (WS-Security) de Liberty que procesa la política del proveedor de servicios web puede utilizar esta información de identificación para autenticar al usuario.

El requisito de UsernameToken se expresa como una de las señales de soporte en la política WS-Security. Puede añadir un requisito de UsernameToken como una señal necesaria en una de las aserciones de señal de soporte, por ejemplo, SupportingTokens, SignedSupportingTokens, SignedEndorsingSupportingTokens, SignedEncryptedSupportingTokens y EncryptedSupportingTokens.

El ejemplo siguiente muestra un fragmento de política de muestra que requiere que se envíe una UsernameToken con texto de contraseña en la cabecera Security de un mensaje SOAP a un proveedor de servicios web:
<sp:SupportingTokens>
  <wsp:Policy>
    <sp:UsernameToken
      sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
      <wsp:Policy>
        <sp:WssUsernameToken11 />
      </wsp:Policy>
    </sp:UsernameToken>
  </wsp:Policy>
</sp:SupportingTokens>

Además del requisito de proporcionar un nombre de usuario o una contraseña, puede configurar una política para incluir una indicación de fecha y hora nonce y created en una UsernameToken.

El ejemplo siguiente muestra un fragmento de política de muestra que requiere que se envíen una UsernameToken con texto de contraseña, nonce y el TimeStamp (indicación de fecha y hora) created en la cabecera Security de un mensaje SOAP a un proveedor de servicios web:
<sp:SupportingTokens>
  <wsp:Policy>
    <sp:UsernameToken
      sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
      <wsp:Policy>
        <sp:WssUsernameToken11 />
        <sp13:Created />
        <sp13:Nonce />
      </wsp:Policy>
    </sp:UsernameToken>
  </wsp:Policy>
</sp:SupportingTokens>
El ejemplo siguiente muestra un fragmento de política de muestra que requiere una UsernameToken con resumen de contraseñas en lugar de texto de contraseña:
<sp:SupportingTokens>
  <wsp:Policy>
    <sp:UsernameToken
      sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
      <wsp:Policy>
        <sp:WssUsernameToken11 />
        <sp:HashPassword />
      </wsp:Policy>
    </sp:UsernameToken>
  </wsp:Policy>
</sp:SupportingTokens>

Para obtener más información sobre nonce, created y distintos tipos de contraseña, consulte la especificación OASIS WS-Security policy 1.3.

Suministro de nombre de usuario y contraseña en un cliente de servicios web

La característica WS-Security de Liberty proporciona más de un método para indicar el nombre de usuario y la contraseña de una aplicación cliente al generar una UsernameToken. Puede establecer el nombre de usuario y la contraseña mediante programación o en el archivo server.xml.

Un cliente puede generar una UsernameToken con el nombre de usuario y contraseña proporcionados en el archivo server.xml. El nombre de usuario y la contraseña que se encuentran en el archivo server.xml se consideran la configuración predeterminada y lo que se proporciona en el RequestContext de la invocación de servicio web del cliente lo altera temporalmente.

En el ejemplo siguiente, se muestra una configuración predeterminada de ejemplo:
<wsSecurityClient id="default"
    ws-security.username="alice"
    ws-security.callback-handler="com.acme.PasswordCallback"
</wsSecurityClient>
Para generar una UsernameToken con el nombre de usuario y contraseña determinados mediante programación, puede establecer las propiedades CXF siguientes en el RequestContext para la invocación de servicio web del cliente:
  • ws-security.username: nombre de usuario
  • ws-security.password: contraseña de usuario si no se ha definido ws-security.callback-handler
  • ws-security.callback-handler: la clase de implementación CallbackHandler utilizada para obtener las contraseñas
En el ejemplo de código siguiente se muestra cómo proporcionar un nombre de usuario y una contraseña en el contexto de solicitud:
Mapa<Serie, Objeto> requestCtx = ((BindingProvider)port).getRequestContext();
requestCtx.put("ws-security.username", "bob_username");
requestCtx.put("ws-security.password", "bob_password");

Consumo de una UsernameToken en un proveedor de servicios web

Cuando se recibe una UsernameToken, WS-Security utiliza automáticamente el registro de usuarios de seguridad de Liberty para validar el nombre de usuario y la contraseña, si la contraseña es necesaria. Si el tipo de contraseña en UsernameToken es PasswordDigest, o utiliza claves derivadas, debe proporcionar la implementación ws-security.callback-handler de un manejador de devolución de llamada de contraseña configurándolo en el archivo server.xml. Este manejador de devolución de llamada debe devolver contraseñas válidas para todos los nombres de usuario esperados para que el módulo ejecutable de WS-Security pueda calcular los valores de resumen para la comparación con el valor del mensaje SOAP. Después de que la comparación del valor de resumen se completa satisfactoriamente, se validan el nombre de usuario y la contraseña con el registro de usuarios.

En el ejemplo siguiente se ilustra una configuración de muestra del archivo server.xml para el resumen de contraseñas:
<wsSecurityProvider id="default"
    ws-security.callback-handler="com.acme.PasswordCallback"
</wsSecurityProvider>

CallbackHandler de contraseña

WS-Security utiliza el CallbackHandler de contraseña para recuperar una contraseña de usuario. En Liberty, esta clase CallbackHandler de contraseña se debe empaquetar como una característica de Liberty. Para obtener más información sobre el CallbackHandler de contraseña, consulte Desarrollo de un manejador de devolución de llamada de contraseña para WS-Security.

Para obtener más información sobre requisitos y limitaciones de una implementación de manejador de devolución de llamada, consulte la sección CallbackHandler de contraseña de clave privada de Protección de servicios web con una señal X.509.

Protección de UsernameToken en mensajes SOAP

Al especificar UsernameToken en una política, el tipo de contraseña es texto de contraseña (PasswordText) de forma predeterminada. Cuando se envía una contraseña con texto de contraseña, se envía el mensaje tal como está. En el ejemplo siguiente se muestra UsernameToken con un tipo de contraseña de PasswordText:
<UsernameToken>
  <Username>myusername</Username>
  <Password
    Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
    mypassword
  </Password>
</UsernameToken>

Si desea enviar un UsernameToken con PasswordText, debe tener en cuenta protecciones adicionales en el mensaje como, por ejemplo, utilizar HTTPS o cifrar la señal utilizando la aserción de política EncryptedSupportingToken. Si desea más información sobre el uso necesario del transporte HTTPS en la política, consulte Liberty: Aserciones de política de transporte HTTPS de seguridad de servicios web.

Derivación de clave de UsernameToken

Como se indica en la especificación Web Services Security UsernameToken Profile 1.1:

La contraseña asociada a un nombre de usuario se puede utilizar para derivar una clave secreta compartida para fines de protección de integridad o confidencialidad del contenido de los mensajes.

Se debe tener en cuenta que las contraseñas están en peligro de varios tipos de ataque, que a su vez provocan la exposición de las claves derivadas. Este procedimiento de derivación de clave pretende minimizar el riesgo de ataques en las claves, hasta el punto en que sea posible, pero está finalmente limitado por la inseguridad de una contraseña que un usuario puede recordar y escribir en un teclado estándar.

Son necesarios dos elementos adicionales para habilitar la derivación de una clave de una contraseña. Son <wsse11:Salt> y <wsse11:Iteration>. Estos valores no son secretos y se deben transmitir en la señal Username cuando se utiliza la derivación de clave. Cuando se utiliza derivación de clave no se debe incluir la contraseña en la señal de nombre de usuario. El receptor utilizará su conocimiento de la contraseña para derivar la misma clave que el remitente.

Si una UsernameToken utiliza derivación de clave, para una aplicación de proveedor, debe proporcionar la implementación ws-security.callback-handler de un manejador de devolución de llamada de contraseña configurándolo en el archivo server.xml.

En el ejemplo siguiente se muestra un fragmento de política para una señal de nombre de usuario (UsernameToken) como una señal de protección con derivación de clave:
<sp:SymmetricBinding>
  <wsp:Policy>
    <sp:ProtectionToken>
      <wsp:Policy>
        <sp:UsernameToken
          sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
          <wsp:Policy>
            <sp:WssUsernameToken10 />
            <sp:RequireDerivedKeys />
          </wsp:Policy>
        </sp:UsernameToken>
      <wsp:Policy>
    </sp:ProtectionToken>
  </wsp:Policy>
</sp:SymmetricBinding>
En el ejemplo siguiente se muestra una señal de nombre de usuario de ejemplo en la cabecera de seguridad cuando se utiliza la derivación de clave:
<wsse:UsernameToken wsse:Id="...">
  <wsse:Username>...</wsse:Username>
  <wsse11:Salt>...</wsse11:Salt>
  <wsse11:Iteration>...</wsse11:Iteration>
</wsse:UsernameToken>

Icono que indica el tipo de tema Tema de concepto

Nombre de archivo: cwlp_wssec_utoken.html