Principalnamen des Kerberos-Clients einer WebSphere-Benutzerregistry-ID für SPNEGO-TAI zuordnen (veraltet)

Sie können eine Systemprogrammierschnittstelle (SPI, System Programming Interface) verwenden, um das Verhalten des SPNEGO-TAI (Simple and Protected GSS-API Negotiation Mechanism, Trust-Association-Interceptor) anzupassen, indem Sie beliebige Zuordnungen der Identität des Endbenutzers, die aus Microsoft Active Directory abgerufen wird, zu der Identität, die in der Sicherheitsregistry von WebSphere Application Server verwendet wird, implementieren.

Vorbereitende Schritte

Sie müssen in der Umgebung von WebSphere Application Server einige Verwaltungsaufgaben ausführen, um den SPNEGO-TAI verwenden zu können und sicherzustellen, dass die Identität des Anforderers mit der Identität in der Benutzerregistry von WebSphere Application Server übereinstimmt.
Veraltetes Feature Veraltetes Feature:

In WebSphere Application Server Version 6.1 wurde ein TAI eingeführt, der SPNEGO (Simple and Protected GSS-API Negotiation Mechanism) nutzt, um HTTP-Anforderungen für geschützte Ressourcen sicher auszuhandeln und zu authentifizieren. Diese Funktion wird in WebSphere Application Server 7.0 nicht weiter unterstützt. Die SPNEGO-Webauthentifizierung wird jetzt genutzt, um SPNEGO-Filter dynamisch neu zu laden und den Rückgriff auf die Methode der Anwendungsanmeldung zu ermöglichen.

depfeat
Anmerkung: Stellen Sie sicher, dass die folgenden Tasks erfolgreich ausgeführt wurden:
  1. Web-Browser für die Verwendung von SPNEGO konfigurieren. Nähere Informationen hierzu finden Sie im Artikel Client-Browser für die Verwendung von SPNEGO konfigurieren (nicht mehr unterstützt).
  2. JVM-Eigenschaften (Java™ Virtual Machine) konfigurieren, angepasste Eigenschaften für den SPNEGO-TAI konfigurieren und den SPNEGO-TAI aktivieren. Nähere Informationen hierzu finden Sie im Artikel Angepasste JVM-Eigenschaften konfigurieren, HTTP-Anforderungen filtern und SPNEGO-TAI in WebSphere Application Server aktivieren (nicht mehr unterstützt).

Informationen zu diesem Vorgang

Bei der einfachsten Implementierung des SPNEGO-TAI wird vorausgesetzt, dass die Identität des Anforderers in der Benutzerregistry von WebSphere Application Server mit der abgerufenen Identität übereinstimmt. Dies ist der Fall, wenn Microsoft Windows Active Directory Server als LDAP-Server für WebSphere Application Server verwendet wird. Dies ist das Standardverhalten des SPNEGO-TAI.

Sie müssen diese einfache Implementierung von SPNEGO-TAI jedoch nicht übernehmen. WebSphere Application Server kann auch eine andere Registry als Microsoft Active Directory benutzen, z. B. eine lokale Betriebssystemregistry, eine LDAP-Registry oder eine angepasste Registry. In diesem Fall müssen allerdings die Benutzer-IDs von Microsoft Windows den Benutzer-IDs von WebSphere Application Server zugeordnet werden.

Vorgehensweise

Verwenden Sie das angepasste JAAS-Anmeldemodul, um angepasste Zuordnungen zwischen einem Kerberos-Principalnamen für den Client aus Microsoft Active Directory und einer WebSphere-Benutzerregistry-ID vorzunehmen. Das angepasste JAAS-Anmeldemodul ist ein Plug-in-Mechanismus, der für die Authentifizierung eingehender und abgehender Anforderungen in WebSphere Application Server definiert ist und vor ltpaLoginModule eingefügt wird. Das angepasste JAAS-Anmeldemodul ruft einen Kerberos-Principalnamen für den Client im javax.security.auth.Subject über die Methode subject.getPrincipals(KerberosPrincipal.class) ab, ordnet diesen der WebSphere-Benutzerregistry-ID zu und fügt die Zuordnungs-ID in die Hashtabelleneigenschaft com.ibm.wsspi.security.cred.userId ein. Das ltpaLoginModule verwendet anschließend die zugeordnete ID, um einen WSCredential zu erstellen.
Anmerkung: Das angepasste Anmeldemodul kann auch den vollständigen Satz mit Sicherheitseigenschaften im javax.security.auth.Subject des com.ibm.wsspi.security.tai.TAIResult bereitstellen, um die zugeordnete ID vollständig zuzusichern. Wenn die ID vollständig zugesichert ist, ordnet wsMapDefaultInboundLoginModule diese Sicherheitseigenschaften einem WSCredential zu.
Im Folgenden sehen Sie ein Beispiel für das angepasste Anmeldemodul:
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 {
    /*
     * 
     * Konstante, die den Namen dieses Zuordnungsmoduls repräsentiert. Wenn mit diesem
     * Beispielcode eine Klasse anderen Namens erstellt wird, muss dieser Wert geändert werden.
     * 
     */
    private final static String MAPPING_MODULE_NAME = "com.ibm.websphere.security.sampleSpnegoMappingLoginModule";

    private String mapUid = null;
    /**
     * Nicht initialisiertes WSLoginModuleImpl-Objekt erstellen
     */
    public sampleSpnegoMappingLoginModule() {
        debugOut("sampleSpnegoMappingLoginModule() entry");
        debugOut("sampleSpnegoMappingLoginModule() exit");
    }

    /**
     * Das Anmeldemodul initialisieren
     *
     * 
     * Dieser Aufruf wird vom LoginContext nach der Instanziierung dieses
     * Anmeldemoduls ausgeführt. Die relevanten Informationen werden vom
     * LoginContext an dieses Anmeldemodul übergeben. Falls das Anmeldemodul
     * die in den Parametern sharedState und options gespeicherten Daten
     * nicht versteht, können diese ignoriert werden.
     * 
     *
     * @param subject Das zu authentifizierende Subject.
     * @param callbackHandler
     *                Ein CallbackHandler für die Kommunikation mit dem
     *                Endbenutzer zum Abrufen der Anmeldeinformationen
     *                (Benutzername und Kennwort)
          * @param sharedState
     *                Der mit anderen konfigurierten Anmeldemodulen gemeinsam genutzte Status.
     * @param options Die in der Anmeldekonfiguration für dieses spezielle Anmeldemodul angegebenen Optionen.
     */
    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");
    }

    /**
     * 
     * Methode für die Authentifizierung eines Subject (Phase 1).
     * 
     *
     * 
     * Diese Methode authentifiziert ein Subject. Es verwendet den CallbackHandler, um
     * die Informationen zum Subjekt zu erfassen, wie z. B. Benutzername und Kennwort, und um
     * diese Informationen zu prüfen. Das Ergebnis der Authentifizierung wird im privaten
     * Status in diesem Anmeldemodul gespeichert.
     * 
     *
     * @return true, wenn die Authentifizierung erfolgreich ist, oder false,
     *         wenn das Anmeldemodul ignoriert werden soll.
          * @exception LoginException
     *                   Wenn die Authentifizierung fehlschlägt.
     */
    	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("Add a mapping user ID to Hashtable, mapping ID = "+mapUid); 

                                    }
                                 debugOut("login() custom properties = " + customProperties);
            }
        }

        succeeded = true;
        debugOut("sampleSpnegoMappingLoginModule.login() exit"); 

        return succeeded;
    }

    /**
     * 
     * Methode zum Festschreiben des Authentifizierungsergebnisses (Phase 2)
     * 
     *
     * 
     * Diese Methode wird aufgerufen, wenn die Gesamtauthentifizierung des LoginContext
     * erfolgreich ist (REQUIRED, REQUISITE, SUFFICIENT und OPTIONAL)
     * 
     *
     * @return true, wenn die Festschreibung erfolgreich ist, oder false,
     *         wenn das Anmeldemodul ignoriert werden soll.
          * @exception LoginException
     *                   Wenn die Festschreibung scheitert.
     */
    public boolean commit() throws LoginException              
    {
        debugOut("commit()");

        debugOut("commit()");

        return true;
    }

    /**
     * Methode zum Abbrechen der Authentifizierung (Phase 2)
     *
     * 
     * Diese Methode wird aufgerufen, wenn die Gesamtauthentifizierung des LoginContext
     * scheitert (REQUIRED, REQUISITE, SUFFICIENT und OPTIONAL)
     * 
     *
     * 
     * Wenn die Authentifizierung des Anmeldemoduls erfolgreich war, bereinigt
     * diese Methode den vorherigen, in Phase 1 gespeicherten Status.
     * 
     *
     * @return true, wenn der Abbruch erfolgreich ist, oder false,
     *         wenn das Anmeldemodul ignoriert werden soll.
          * @exception LoginException
     *                   Wenn der Abbruch scheitert.
     */
    public boolean abort() throws LoginException {
        debugOut("abort() entry");
        debugOut("abort() exit");
        return true;
    }

    /**
     * Methode zum Abmelden eines Subject-Objekts
     *
     * @return true, wenn die Abmeldung erfolgreich ist, oder false,
     *         wenn das Anmeldemodul ignoriert werden soll.
          * @exception LoginException
     *                   Wenn die Abmeldung scheitert.
     */
    public boolean logout() throws LoginException
    {
        debugOut("logout() entry");
        debugOut("logout() exit");

        return true;
    }

    private void cleanup()
    {
        debugOut("cleanup() entry");
        debugOut("cleanup() exit");
    }

    /*
     * 
     * Private Methode zum Ausgeben von Traceinformationen. Diese Implementierung verwendet
     * System.out für die Ausgabe der Traceinformationen an die Standardausgabe. Sie können
     * hier auch ein eigenes Tracesystem implementieren.
     * 
     */
    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;
}

Ergebnisse

Über das angepasste Anmeldemodul werden IDs aus Microsoft Active Directory der Sicherheitsregistry von WebSphere Application Server zugeordnet, und das Verhalten des SPNEGO-TAI wird angepasst.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_SPNEGO_tai_umapper
Dateiname:tsec_SPNEGO_tai_umapper.html