Correlación del nombre principal del cliente Kerberos con el ID del registro de usuarios de WebSphere para SPNEGO TAI (en desuso)
Puede utilizar una interfaz de programación del sistema para personalizar el comportamiento de TAI (interceptor de asociación de confianza) del mecanismo SPNEGO (Simple and Protected GSS-API Negotiation Mechanism) implementando correlaciones arbitrarias de la identidad del usuario final, que se recupera desde Microsoft Active Directory para la identidad utilizada en el registro de seguridad de WebSphere Application Server.
Antes de empezar

En WebSphere Application Server Versión 6.1 se introdujo un interceptor de asociación de confianza (TAI) que utiliza el mecanismo SPNEGO (Simple and Protected GSS-API Negotiation Mechanism) para negociar y autenticar de forma segura solicitudes HTTP para los recursos protegidos. En WebSphere Application Server 7.0, esta función está en desuso. La autenticación web SPNEGO ha ocupado su lugar para proporcionar la recarga dinámica de filtros SPNEGO y para habilitar la recuperación para el método de inicio de sesión de la aplicación.
depfeat- Configuración del navegador web para utilizar SPNEGO. Consulte Configuración del navegador de cliente para utilizar SPNEGO TAI (en desuso)
- Configuración de las propiedades de JVM (Java™ Virtual Machine), personalización de las propiedades de SPNEGO TAI y habilitación de SPNEGO TAI. Consulte Configuración de las propiedades personalizadas de JVM, filtrado de solicitudes HTTP y habilitación de SPNEGO TAI en WebSphere Application Server (en desuso)
Acerca de esta tarea
No es necesario que utilice este despliegue sencillo del SPNEGO TAI. WebSphere Application Server puede utilizar un registro diferente, como por ejemplo un sistema operativo local, LDAP o el registro personalizado, en lugar de Microsoft Active Directory. Si WebSphere Application Server utiliza un registro diferente a Microsoft Active Directory, es necesaria una correlación del ID de usuario de Microsoft Windows con un ID de usuario de WebSphere Application Server.
Procedimiento
package com.ibm.ws.security.server.lm;
import java.util.Map;
import java.lang.reflect.Array;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.kerberos.*;
import com.ibm.websphere.security.auth.WSLoginFailedException;
import com.ibm.wsspi.security.token.AttributeNameConstants;
/**
*
* @author IBM Corporation
* @version 1.0
* @since 1.0
*
*/
public class sampleSpnegoMappingLoginModule implements LoginModule {
/*
*
* Constante que representa el nombre de este módulo de correlación. Si se utiliza
* este código de ejemplo para crear una clase con otro nombre, este valor debe cambiarse.
*
*/
private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";
private String mapUid = null;
/**
* Crear un objeto WSLoginModuleImpl no inicializado.
*/
public sampleSpnegoMappingLoginModule() {
debugOut("sampleSpnegoMappingLoginModule() entry");
debugOut("sampleSpnegoMappingLoginModule() exit");
}
/**
* Inicializar este módulo de inicio de sesión.
*
*
* Se invoca mediante LoginContext después de crear una instancia de
* este módulo de inicio de sesión. Se pasa la información relevante desde LoginContext
* a este módulo de inicio de sesión. Si el módulo de inicio de sesión no comprende los datos
* almacenados en los parámetros sharedState y options,
* se pueden ignorar.
*
*
* @param subject The subject to be authenticated.
* @param callbackHandler
* CallbackHandler para comunicarse con el usuario final para reunir
información de inicio de sesión (por ejemplo, nombre de usuario y contraseña).
* @param sharedState
* Estado compartido con otros módulos de inicio de sesión configurados.
* @param options Opciones especificadas en la configuración de inicio de sesión de este módulo de inicio de sesión concreto.
*/
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options) {
debugOut("initialize(subject = \"" + subject.toString() +
"\", callbackHandler = \"" + callbackHandler.toString() +
"\", sharedState = \"" + sharedState.toString() +
"\", options = \"" + options.toString() + "\")");
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
debug = "true".equalsIgnoreCase((String)this.options.get("debug"));
debugOut("initialize() exit");
}
/**
*
* Método para autenticar un asunto (fase 1).
*
*
*
* Este método autentica un asunto. Utiliza CallbackHandler para recopilar información
* sobre el asunto, como el nombre de usuario y la contraseña y verificar
* esta información. El resultado de la autenticación se guarda en estado privado dentro de
* este módulo de inicio de sesión.
*
*
* @return true si la autenticación es satisfactoria o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla la autenticación.
*/
public boolean login() throws LoginException
{
debugOut("sampleSpnegoMappingLoginModule.login() entry");
boolean succeeded = false;
java.util.Set krb5Principals= subject.getPrincipals(KerberosPrincipal.class);
java.util.Iterator krb5PrincIter = krb5Principals.iterator();
while (krb5PrincIter.hasNext()) {
Object princObj = krb5PrincIter.next();
debugOut("Kerberos principal name: "+ princObj.toString());
if (princObj != null && princObj.toString().equals("utle@WSSEC.AUSTIN.IBM.COM")){
mapUid = "user1";
debugOut("mapUid: "+mapUid);
java.util.Hashtable customProperties = (java.util.Hashtable)
sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new java.util.Hashtable();
}
succeeded = true;
customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, mapUid);
Map<String,java.util.Hashtable)>
mySharedState=(Map<String,java.util.Hashtable>)sharedState;
mySharedState.put((AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY.customProperties);
debugOut("Añadir un ID de usuario de correlación a Hashtable, ID de correlación = "+mapUid);
}
debugOut("login() custom properties = " + customProperties);
}
}
succeeded = true;
debugOut("sampleSpnegoMappingLoginModule.login() exit");
return succeeded;
}
/**
*
* Método para comprometer el resultado de la autenticación (fase 2).
*
*
*
* Este método se invoca si la autenticación general de LoginContext ha sido
* satisfactoria (el módulo de inicio de sesión REQUIRED, REQUISITE, SUFFICIENT y OPTIONAL
* se ha realizado correctamente).
*
*
* @return true si el compromiso es satisfactorio o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla el compromiso.
*/
public boolean commit() throws LoginException
{
debugOut("commit()");
debugOut("commit()");
return true;
}
/**
* Método para terminar anormalmente el proceso de autenticación (fase 2).
*
*
* Este método se invoca si la autenticación general de LoginContext ha sido
* errónea (el módulo de inicio de sesión REQUIRED, REQUISITE, SUFFICIENT y OPTIONAL
* no se ha ejecutado correctamente).
*
*
*
*Si el intento de autenticación de este módulo de inicio de sesión ha sido correcto, este método
* limpia el estado anterior guardado en la fase 1.
*
*
* @return true si la finalización anómala es satisfactoria o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla la finalización anómala.
*/
public boolean abort() throws LoginException {
debugOut("abort() entry");
debugOut("abort() exit");
return true;
}
/**
* Método que finaliza la sesión de un sujeto.
*
* @return true si la desconexión es satisfactoria o false
* si se debe ignorar este módulo de inicio de sesión.
* @exception LoginException
* Si falla la desconexión.
*/
public boolean logout() throws LoginException
{
debugOut("logout() entry");
debugOut("logout() exit");
return true;
}
private void cleanup()
{
debugOut("cleanup() entry");
debugOut("cleanup() exit");
}
/*
*
* Método privado para imprimir la información de rastreo. Esta implementación utiliza System.out
* para imprimir la información de rastreo en la salida estándar, pero un sistema de rastreo personalizado puede
* implementarse aquí también.
*
*/
private void debugOut(Object o)
{
System.out.println("Debug: " + MAPPING_MODULE_NAME);
if (o != null) {
if (o.getClass().isArray()) {
int length = Array.getLength(o);
for (int i = 0; i < length; i++) {
System.out.println("\t" + Array.get(o, i));
}
} else {
System.out.println("\t" + o);
}
}
}
private Subject subject;
private CallbackHandler callbackHandler;
private Map sharedState;
private Map options;
protected boolean debug = false;
}