Generación y consumo de señales personalizadas con los módulos genéricos de inicio de sesión de emisión

El generador y el consumidor genéricos de señales emitidas, GenericIssuedTokenGenerateLoginModule y GenericIssuedTokenConsumeLoginModule, pueden utilizarse junto con las SPI GenericSecurityTokenFactory i GenericSecurityToken para implementar una solución integral para una señal personalizada. La generación y el consumo de señales con los módulos genéricos de inicio de sesión de emisión pueden realizarse con política y enlaces o WSSAPI.

Antes de empezar

Debe tener un conjunto de aplicaciones de cliente y proveedor de servicio JAX-WS en funcionamiento donde añadir las clases de módulo de inicio de sesión JAAS nuevas.

Acerca de esta tarea

Complete los pasos siguientes si desea habilitar un conjunto de aplicaciones de cliente y proveedor de servicio JAX-WS para utilizar una señal personalizada. En estos pasos MyToken es el nombre de la señal que se está creando.

Al completar esta tarea:
  1. Se crean dos módulos de inicio de sesión JAAS; uno para generar la señal y uno para consumirla.
  2. La señal se genera y consume con la ayuda del consumidor y el generador de señales emitidas genéricas.
  3. A continuación, se aplican restricciones de seguridad a las aplicaciones con conjuntos y enlaces de políticas.

Procedimiento

  1. Cree el módulo de inicio de sesión JAAS de generador siguiente y póngalo a disposición para el código de aplicación
    package test.tokens;
    
    import java.util.ArrayList;
    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 javax.xml.soap.SOAPFactory;
    import javax.xml.soap.SOAPElement;
    import javax.xml.namespace.QName;
    import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
    import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
    
    public class MyCustomGenerator 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 {
    
        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");
        }
        SecurityToken myToken = null;
                 try {
          SOAPElement tokenElement = createCustomElement(factory);
          myToken = factory.getToken(tokenElement, new QName("http://www.acme.com","MyToken"));
        } catch(Exception e) {
          throw new LoginException(e.toString());
        }
        if (myToken == null) {
          throw new LoginException("myToken is null");
        }
    
        //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, myToken);
    
        return true;
      }
    
      private SOAPElement createCustomElement(GenericSecurityTokenFactory gstFactory) throws Exception {
        /*
          <acme:MyToken xmlns:acme="http://www.acme.com" 
                xmlns:utl="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" utl:Id="cust_3">
            <acme:EMail>joe.smith@acme.com</acme:EMail>
          </acme:MyToken>
        */
        SOAPFactory factory = SOAPFactory.newInstance();
    
        //Crear el elemento MyToken
        SOAPElement tokElement = factory.createElement("MyToken", "acme", "http://www.acme.com");
        //Añadir el atributo ID
        tokElement.addAttribute(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", "utl"), gstFactory.createUniqueId());
    
        //Crear el elemento Email
        SOAPElement emailElement = factory.createElement("Email", "acme", "http://www.acme.com");
        emailElement.addTextNode("joe.smith@acme.com");
    
        //Añadir el elemento EMail a MyToken
        tokElement.addChildElement(emailElement);
    
        return tokElement;
      }
    
      public boolean logout() throws LoginException {
        return false;
      } 
      public boolean abort() throws LoginException {
        return false;
      }
      public boolean commit() throws LoginException {
        return true;
      }
    }
  2. Cree el módulo de inicio de sesión JAAS de consumidor siguiente y póngalo a disposición para el código de aplicación
    package test.tokens;
    
    import java.util.Map;
    import javax.xml.namespace.QName;
    import org.apache.axiom.om.OMElement;
    import javax.security.auth.Subject;
    import javax.security.auth.callback.Callback;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    import com.ibm.websphere.wssecurity.callbackhandler.PropertyCallback;
    import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
    import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
    import com.ibm.wsspi.wssecurity.wssapi.OMStructure;
    
    public class MyCustomConsumer implements LoginModule {
    
      private CallbackHandler _handler;
      private Map _sharedState;
    
      public void initialize(Subject subject, CallbackHandler callbackHandler,
                             Map<String, ?> sharedState, Map<String, ?> options) {
        this._handler = callbackHandler;
        this._sharedState = sharedState;
      }
    
      public boolean login() throws LoginException {
        PropertyCallback propertyCallback = new PropertyCallback(null);
        Callback[] callbacks = new Callback[] { propertyCallback};
    
                 try {
          this._handler.handle(callbacks);
        } catch(Exception e) {
          throw new LoginException(e.toString());
        }
        //Obtener GenericSecurityTokenFactory
        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");
        }
        //Obtener la señal consumida por GenericIssuedConsumeLoginModule
        SecurityToken myToken = factory.getConsumerTokenFromSharedState(_sharedState, 
                                                                        new QName("http://www.acme.com","MyToken"));
    
        if (myToken == null) {
          throw new LoginException("no token");
        }
    
        //Obtener el elemento de señal
        Object obj = myToken.getXML();
        if (obj == null) {
          throw new LoginException("token is empty");
        }
        if (!(obj instanceof OMStructure)) {
          throw new LoginException("XML is not OMStructure");
        }
        OMElement tokenElement = ((OMStructure)obj).getNode();
        //puede utilizar el método org.apache.axis2.util.XMLUtils.toDOM
        //si desea trabajar con un elemento w3c.dom en lugar de un
        //elemento Axiom
    
        //Lleve a cabo procedimientos en el contenido del elemento de señal
        OMElement el = tokenElement.getFirstChildWithName(new QName("http://www.acme.com","Email"));
        if (el == null) {
          throw new LoginException("no email element");
        }
        String value = el.getText();
    
        if (value != null && value.equals("joe.smith@acme.com")) {
          return true;
        } else {
          throw new LoginException("email value is bad");
        }
      }
      public boolean commit() throws LoginException {
        return true;
      }
      public boolean logout() throws LoginException {
        return false;
      }
      public boolean abort() throws LoginException {
        return false;
      }
    
    }
  3. Crear nuevas configuraciones de inicio de sesión JAAS.
    1. En la consola administrativa, seleccione Seguridad-> Seguridad global.
    2. En Autenticación, seleccione Servicio de autenticación y autorización Java.
    3. Seleccione Inicios de sesión de sistema.
    4. Cree primer el generador con el módulo personalizado.
      1. Pulse Nuevo y, a continuación, especifique Alias = test.generate.custom.
      2. Pulse Nuevo y, a continuación, especifique Module class name = test.tokens.MyCustomGenerator.
      3. Seleccione Utilizar proxy de módulo de inicio de sesión .
      4. Pulse OK (Aceptar).
      5. Pulse Nuevo y, a continuación, seleccione Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule.
      6. Pulse Aceptar.
      7. Pulse JAAS - Inicios de sesión del sistema.
    5. Cree el consumidor con el módulo personalizado en último lugar.
      1. Pulse Nuevo y, a continuación, especifique Alias = test.consume.custom.
      2. Pulse Nuevo y, a continuación, seleccione Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenConsumeLoginModule.
      3. Pulse Nuevo y, a continuación, especifique Module class name = test.tokens.MyCustomConsumer.
      4. Seleccione Utilizar proxy de módulo de inicio de sesión .
      5. Pulse Aceptar.
    6. Pulse Guardar.
  4. Cree el conjunto de políticas personalizado.
    1. En la consola administrativa, pulse Servicios > Conjuntos de políticas > Conjuntos de políticas de aplicación.
    2. Pulse Nuevo y, a continuación, especifique ACustomTokenPolicy.
    3. Pulse Aplicar.
    4. En Políticas, pulse Añadir > WS-Security.
  5. Edite el conjunto de políticas personalizado.
    1. En la consola administrativa, pulse WS-Security > Política principal.
    2. Elimine los elementos no deseados:
      1. Deseleccione Incluir indicación de fecha y hora en la cabecera de seguridad.
      2. Desmarque Protección de nivel de mensaje.
    3. Añada la señal personalizada.
      1. Pulse Políticas de señal de solicitud
      2. Pulse Añadir tipo de señal > Personalizada y, a continuación, especifique:
        • Nombre de señal personalizada = myToken
        • Parte local = MyToken
        • URI de espacio de nombres = http://www.acme.com
      3. Pulse Aceptar.
    4. Pulse Guardar.
  6. Configure el cliente para utilizar el conjunto de políticas ACustomTokenPolicy.
    1. En la consola administrativa, pulse Servicios > Clientes de servicio.
    2. Pulse en el cliente de servicio deseado.
    3. Seleccione el recurso en el nivel superior.
    4. Pulse Conectar conjunto de políticas.
    5. Seleccione ACustomTokenPolicy
  7. Cree un enlace personalizado para el cliente.
    1. Vuelva a seleccionar el recurso en el nivel superior.
    2. Pulse Asignar enlace.
    3. Pulse Nuevo enlace específico de la aplicación para crear un enlace específico de la aplicación.
    4. Especifique el nombre de configuración de los enlaces.

      name: customTokenClientBinding

    5. Pulse Añadir > WS-Security.

      Si el panel Enlaces de política de seguridad de mensajes principales no se muestra, seleccione WS-Security.

  8. Configure los enlaces personalizados del cliente.
    1. Seleccione Autenticación y protección > request:myToken.
    2. Seleccione JAAS login = test.generate.custom.
    3. Pulse Aplicar.
    4. Pulse Manejador de retorno de llamada.
    5. Añada la propiedad personalizada passThroughToken=true.
  9. Configure el proveedor para utilizar el conjunto de políticas ACustomTokenPolicy.
    1. En la consola administrativa, pulse Servicios > Proveedores de servicios.
    2. Pulse en el proveedor de servicio deseado.
    3. Seleccione el recurso en el nivel superior.
    4. Pulse Conectar conjunto de políticas.
    5. Seleccione ACustomTok enPolicy.
  10. Cree un enlace personalizado para el proveedor.
    1. Vuelva a seleccionar el recurso en el nivel superior.
    2. Pulse Asignar enlace.
    3. Pulse Nuevo enlace específico de la aplicación para crear un enlace específico de la aplicación.
    4. Especifique el nombre de configuración de los enlaces.

      customTokenProviderBinding

    5. Pulse Añadir > WS-Security.

      Si el panel Enlaces de política de seguridad de mensajes principales no se muestra, seleccione WS-Security.

  11. Configure los enlaces personalizados para el proveedor.
    1. Seleccione Autenticación y protección > request:myToken.
    2. Seleccione JAAS login = test.consume.custom.
    3. Pulse Aplicar.
    4. Pulse Manejador de retorno de llamada.
    5. Añada las propiedades personalizadas passThroughToken=true y alwaysGeneric=true.
  12. Pulse Guardar para guardar los cambios realizados en la configuración.
  13. Reinicie el servidor de aplicaciones para aplicar los cambios de configuración JAAS.
  14. Pruebe el servicio.

Ejemplo

El ejemplo siguiente ilustra la cabecera de seguridad SOAP que se produce al seguir el procedimiento anterior.

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
    <acme:MyToken xmlns:acme="http://www.acme.com" xmlns:utl="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" utl:Id="cust_3">
        <acme:Email>joe.smith@acme.com</acme:Email>
    </acme:MyToken>
</wsse:Security>

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_gen_consum_custtokens
File name: twbs_gen_consum_custtokens.html