Generación de un UsernameToken dinámico utilizando un módulo de inicio de sesión JAAS apilado

Puede utilizar las API de GenericSecurityTokenFactory para crear señales de seguridad UsernameToken totalmente llena o simple para su uso por parte de la ejecución de WS-Security. Estas señales de seguridad pueden ser utilizadas, aunque no de forma exclusiva, para WSSAPI y módulos de inicio de sesión JAAS o UNTGenerateLoginModule.

Acerca de esta tarea

GenericSecurityTokenFactory proporciona varias API que se pueden utilizar para crear UsernameTokens que se pueden emitir con GenericIssuedTokenGenerateLoginModule.

Hay dos tipos de UsernameTokens:
UsernameToken completo
Un UsernameToken completo contiene XML y se puede emitir con el módulo de inicio de sesión GenericSecurityTokenFactory.
UsernameToken simple
Un UsernameToken simple sólo contiene un nombre de usuario y una contraseña; no contiene XML. Los UsernameTokens simples se utilizan para establecer nombres de usuario y contraseñas dinámicos que UNTGenerateLoginModule, LTPAGenerateLoginModule y KRBGenerateLoginModule pueden utilizar.

Cuando se crea un UsernameToken completo utilizando una API GenericSecurityTokenFactory, la señal es la forma completa de una señal de seguridad que puede ser emitida por el tiempo de ejecución de WS-Security. Determine el tipo de señal que desea crear y, a continuación, emita mandatos, similares a los especificados en uno de los pasos siguientes, para crear su señal.Una vez que la señal se ha creado, el nombre de usuario y la contraseña de la señal no pueden modificarse.

Cuando un UsernameToken simple se crea utilizando una API de GenericSecurityTokenFactory, la señal sólo contiene el nombre de usuario y opcionalmente la contraseña. Dado que un UsernameToken simple no contiene XML, no se puede emitir con GenericIssuedTokenGenerateLoginModule.

Procedimiento

  1. Crear un UsernameToken. Puede crear uno de los siguientes tipos de UsernameToken:
    • Un UsernameToken completo con un nombre de usuario y contraseña
    • Un UsernameToken completo con un nombre de usuario y una indicación de fecha y hora, pero sin contraseña
    • Un UsernameToken simple con un nombre de usuario y una contraseña
    • Crear un UsernameToken completo con un nombre de usuario y una contraseña.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      
      ...
      
      GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
      UsernameToken myUnt = gstFactory.getFullUsernameToken("myUsername", "myPassword".toCharArray());
    • Crear un UsernameToken completo con un nombre de usuario y una indicación de fecha y hora, pero sin contraseña.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      
      ...
      
      GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
      UsernameToken myUnt = gstFactory.getFullUsernameToken("myUsername", null, true);
    • Crear un UsernameToken completo con un nombre de usuario y una contraseña.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      ...
      GenericSecurityTokenFactory gstFactory = GenericSecurityTokenFactory.getInstance();
      UsernameToken myUnt = gstFactory.getSimpleUsernameToken("myUsername", "myPassword".toCharArray());
  2. Crear un módulo de inicio de sesión JAAS. Si ha creado un UsernameToken completo en el paso anterior, debe crear un módulo de inicio de sesión JAAS que puede apilarse encima de GenericIssuedTokenGenerateLoginModule para emitir una UsernameToken completa. Si ha creado un UsernameToken simple en el paso anterior, debe crear un módulo de inicio de sesión JAAS que pueda apilarse encima de UNTGenerateLoginModule para emitir una UsernameToken dinámica.
    • Cree un módulo de inicio de sesión JAAS que puede apilarse encima de GenericIssuedTokenGenerateLoginModule para emitir una UsernameToken completa.
      El ejemplo siguiente es aplicable si está utilizando la versión 8.5.0.2 o posterior:
      package test.tokens;
      
      import java.util.HashMap;
      import java.util.Map;
      
      import javax.security.auth.Subject;
      import javax.security.auth.callback.CallbackHandler;
      import javax.security.auth.login.LoginException;
      import javax.security.auth.spi.LoginModule;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
      import com.ibm.wsspi.wssecurity.core.config.CallbackHandlerConfig;
      
      import java.util.ArrayList;
      
      public class MyFullUntGenerator implements LoginModule {
      
        private Map _sharedState;
        private Map _options;
        private CallbackHandler _handler;
      
        public void initialize(Subject subject, CallbackHandler callbackHandler,
                               Map<String, ?> sharedState, Map<String, ?> options) {
      
          this._handler = callbackHandler;
          this._sharedState = sharedState;
          this._options = options;  
        }
      
        public boolean login() throws LoginException {
          //Para facilitar la comprensión, este módulo de inicio de sesión no
          //protege contra todos los NPE
      
          GenericSecurityTokenFactory factory = null;
                   try {
            factory = GenericSecurityTokenFactory.getInstance();
          } catch(Exception e) {
            throw new LoginException(e.toString());
          }
          if (factory == null) {
            throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null");
          }
      
          //El ID de usuario y la contraseña pueden obtenerse de la manera que quiera
      
         // (Opcional) Obtenga el nombre de usuario y la contraseña configurados en el manejador de devolución de llamada
          Map wssContext = getWSSContext(_handler);            
          CallbackHandlerConfig chc = (CallbackHandlerConfig) wssContext.get(CallbackHandlerConfig.CONFIG_KEY);    
                                                           
          String username = chc.getUserId();                   
          char[] password = chc.getUserPassword();   
      
          UsernameToken unt = factory.getFullUsernameToken("myUsername", "myPassword".toCharArray());
      	
          //Coloque la señal en una lista en el estado compartido donde estará disponible para ser utilizada por los
          //módulos de inicio de sesión apilados
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //implemente el resto de métodos requeridos por la
        //interfaz de módulo de inicio de sesión
      }
    • Cree un módulo de inicio de sesión JAAS que pueda apilarse encima de UNTGenerateLoginModule para emitir una UsernameToken dinámica
      package test.tokens;
      
      import java.util.HashMap;
      import java.util.Map;
      
      import javax.security.auth.Subject;
      import javax.security.auth.callback.CallbackHandler;
      import javax.security.auth.login.LoginException;
      import javax.security.auth.spi.LoginModule;
      import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
      import com.ibm.wsspi.wssecurity.core.config.CallbackHandlerConfig;
      
      import java.util.ArrayList;
      
      public class MySimpleUntGenerator implements LoginModule {
      
        private Map _sharedState;
        private Map _options;
        private CallbackHandler _handler;
      
        public void initialize(Subject subject, CallbackHandler callbackHandler,
                               Map<String, ?> sharedState, Map<String, ?> options) {
      
          this._handler = callbackHandler;
          this._sharedState = sharedState;
          this._options = options;  
        }
      
        public boolean login() throws LoginException {
          //Para facilitar la comprensión, este módulo de inicio de sesión no
          //protege contra todos los NPE
      
          GenericSecurityTokenFactory factory = null;
                   try {
            factory = GenericSecurityTokenFactory.getInstance();
          } catch(Exception e) {
            throw new LoginException(e.toString());
          }
          if (factory == null) {
            throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null");
          }
      	
          //El ID de usuario y la contraseña pueden obtenerse de la manera que quiera
      
          // (Opcional) Obtenga el nombre de usuario y la contraseña configurados en el manejador de devolución de llamada
          Map wssContext = getWSSContext(_handler);            
          CallbackHandlerConfig chc = (CallbackHandlerConfig) wssContext.get(CallbackHandlerConfig.CONFIG_KEY);    
                                                           
          String username = chc.getUserId();                   
          char[] password = chc.getUserPassword();   
      
          UsernameToken unt = factory.getSimpleUsernameToken("myUsername", "myPassword".toCharArray());
      
          //Coloque la señal en una lista en el estado compartido donde estará disponible para ser utilizada por los
          //módulos de inicio de sesión apilados
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //implemente el resto de métodos requeridos por la
        //interfaz de módulo de inicio de sesión
      }
  3. Crear una configuración de inicio de sesión JAAS.
    1. Tenga en cuenta el nombre de clase completo del módulo de inicio de sesión personalizado que ha creado en el paso anterior. Por ejemplo, test.tokens.MyFullUntGenerator.
    2. Tenga en cuenta el nombre de clase completo del módulo de inicio de sesión sobre el que apila. Por ejemplo, com.ibm.ws.wssecurity.wssapi.token.impl.UNTGenerateLoginModule o com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule.
    3. En la consola administrativa, vaya a Seguridad > Seguridad global.
    4. En autenticación, vaya a Java Authentication and Authorization Service > Inicios de sesión en el sistema.
    5. Pulse Nuevo y, en Alias, especifique test.generate.unt.
    6. En módulos de inicio de sesión JAAS, pulse Nuevo y en Nombre de clase de módulo, escriba el nombre de su módulo de inicio de sesión personalizado. Seleccione Utilizar proxy de módulo de inicio de sesión y pulse Aceptar.
    7. Pulse Nuevo y, en Nombre de clase de módulo, escriba el nombre del módulo de inicio de sesión sobre el que apila. Pulse Aceptar.
  4. Configure el generador de señales UsernameToken que debe utilizar la nueva configuración de inicio de sesión JAAS.
    1. En la consola administrativa, abra la configuración de enlaces que desea cambiar.
    2. Seleccione WS-Security > Autenticación y protección.
    3. En Señales de autenticación, seleccione la señal UsernameToken saliente que desea cambiar.
    4. En Inicio de sesión JAAS, seleccione test.generate.unt.
    5. Opcional: Si utiliza GenericIssuedTokenGenerateLoginModule, añada la propiedad personalizada passThroughToken=true.
      1. Pulse Manejador de retorno de llamada.
      2. Añada la propiedad personalizada passThroughToken=true.
      3. Pulse Aceptar.
  5. Pulse Guardar.
  6. Reinicie el servidor de aplicaciones para aplicar los cambios de configuración JAAS.
  7. Pruebe el servicio.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_createusertokens
File name: twbs_createusertokens.html