Dynamisches Benutzernamenstoken aus einem JAAS-Anmeldemodul im Stack generieren

Sie können die APIs von GenericSecurityTokenFactory verwenden, um vollständig gefüllte oder einfache Sicherheitstoken des Typs "UsernameToken" (Benutzernamenstoken) zur Verwendung durch die WS-Security-Laufzeit zu erstellen. Diese Sicherheitstoken können von WSSAPIs und JAAS-Anmeldemodulen oder von UNTGenerateLoginModule verwendet werden, aber Ihre Verwendung ist nicht auf diese Module beschränkt.

Informationen zu diesem Vorgang

Die GenericSecurityTokenFactory stellt mehrere APIs bereit, die Sie verwenden können, um Benutzernamenstoken (UsernameToken) zu erstellen, die vom GenericIssuedTokenGenerateLoginModule ausgegeben werden können.

Es gibt zwei Arten von Benutzernamenstoken (UsernameToken):
Vollständige Benutzernamenstoken
Ein vollständiges Benutzernamenstoken enthält XML und kann mit dem Anmeldemodul GenericSecurityTokenFactory ausgegeben werden.
Einfaches Benutzernamenstoken
Ein einfaches Benutzernamenstoken enthält nur einen Benutzernamen und ein Kennwort, jedoch kein XML. Einfache Benutzernamenstoken werden verwendet, um einen dynamischen Benutzernamen und ein dynamisches Kennwort zur Verwendung durch die Anmeldemodule UNTGenerateLoginModule, LTPAGenerateLoginModule und KRBGenerateLoginModule festzulegen.

Wenn ein vollständiges Benutzernamenstoken mit einer API von GenericSecurityTokenFactory erstellt wird, hat dieses Token die vollständige Form eines Sicherheitstokens, das von der WS-Security-Laufzeit ausgegeben werden kann. Legen Sie den Typ des zu erstellenden Tokens fest, und erstellen Sie das Token anschließend mit Befehlen wie in den folgenden Schritten. Nachdem das Token erstellt wurde, können der Benutzername und das Kennwort im Token nicht mehr modifiziert werden.

Wird ein einfaches Benutzernamenstoken mit einer API von GenericSecurityTokenFactory erstellt, enthält das Token nur den Benutzernamen und optional das Kennwort. Weil ein einfaches Benutzernamenstoken kein XML enthält, kann es nicht mit GenericIssuedTokenGenerateLoginModule ausgegeben werden.

Vorgehensweise

  1. Erstellen Sie ein Benutzernamenstoken. Sie können einen der folgenden Typen von Benutzernamenstoken erstellen:
    • Ein vollständiges Benutzernamenstoken mit einem Benutzernamen und einem Kennwort
    • Ein vollständiges Benutzernamenstoken mit einem Benutzernamen und einer Zeitmarke, aber ohne Kennwort
    • Ein einfaches Benutzernamenstoken mit einem Benutzernamen und einem Kennwort
    • Vollständiges Benutzernamenstoken mit Benutzernamen und Kennwort erstellen.
      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());
    • Vollständiges Benutzernamenstoken mit Benutzernamen und Zeitmarke erstellen.
      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);
    • Einfaches Benutzernamenstoken mit Benutzernamen und Kennwort erstellen.
      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. JAAS-Anmeldemodul erstellen. Wenn Sie im vorherigen Schritt ein vollständiges Benutzernamenstoken erstellt haben, müssen Sie ein JAAS-Anmeldemodul erstellen, das im Stack über GenericIssuedTokenGenerateLoginModule angeordnet werden kann, um ein vollständiges Benutzernamenstoken auszugeben. Wenn Sie im vorherigen Schritt ein einfaches Benutzernamenstoken erstellt haben, müssen Sie ein JAAS-Anmeldemodul erstellen, das im Stack über UNTGenerateLoginModule angeordnet werden kann, um ein dynamisches Benutzernamenstoken auszugeben.
    • Ein JAAS-Anmeldemodul erstellen, das im Stack über dem GenericIssuedTokenGenerateLoginModule angeordnet werden kann, um ein vollständiges Benutzernamenstoken auszugeben.
      Das folgende Beispiel gilt bei Verwendung von Version 8.5.0.2 oder höher:
      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 {
          //Aus Gründen der Lesbarkeit ist dieses Anmeldemodul so
        //aufgebaut, dass es nicht vor allen Nullzeigerausnahmen (NPEs) schützt
      
          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");
          }
      
          //Benutzer-ID und Kennwort können auf die von Ihnen festgelegte Art und Weise angefordert werden
      
         // (Optional) Im Callback-Handler konfigurierten Benutzernamen und konfiguriertes Kennwort abrufen
          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());
      	
          //Token in einer Liste in den Status für gemeinsame Nutzung (shared state) setzen,
          //damit es von den im Stack enthaltenen Anmeldemodulen genutzt werden kann
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //Implementierung der übrigen Methoden, die die Schnittstelle des Anmeldemoduls
        //(LoginModule) erfordert.
      }
    • Erstellung eines JAAS-Anmeldemoduls, das im Stack über dem UNTGenerateLoginModule angeordent werden kann, um ein dynamisches Benutzernamenstoken auszugeben.
      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 {
          //Aus Gründen der Lesbarkeit ist dieses Anmeldemodul so
        //aufgebaut, dass es nicht vor allen Nullzeigerausnahmen (NPEs) schützt
      
          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");
          }
      	
          //Benutzer-ID und Kennwort können auf die von Ihnen festgelegte Art und Weise angefordert werden
      
          // (Optional) Im Callback-Handler konfigurierten Benutzernamen und konfiguriertes Kennwort abrufen
          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());
      
          //Token in einer Liste in den Status für gemeinsame Nutzung (shared state) setzen,
          //damit es von den im Stack enthaltenen Anmeldemodulen genutzt werden kann
          factory.putGeneratorTokenToSharedState(_sharedState, unt);
      
          return true;
        }
        //Implementierung der übrigen Methoden, die die Schnittstelle des Anmeldemoduls
        //(LoginModule) erfordert.
      }
  3. Erstellen Sie eine JAAS-Anmeldekonfiguration.
    1. Notieren Sie den vollständigen Klassennamen des angepassten Anmeldemoduls, das Sie im vorherigen Schritt erstellt haben. Beispiel: test.tokens.MyFullUntGenerator.
    2. Notieren Sie den vollständigen Klassennamen des Anmeldemoduls, über dem Sie das angepasste Modul im Stack anordnen. Beispiel: com.ibm.ws.wssecurity.wssapi.token.impl.UNTGenerateLoginModule oder com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule.
    3. Wählen Sie in der Administrationskonsole Sicherheit > Globale Sicherheit aus.
    4. Klicken Sie unter "Authentifizierung" auf Java Authentication and Authorization Service > Systemanmeldungen.
    5. Klicken Sie auf Neu, und geben Sie unter "Alias" test.generate.unt ein.
    6. Klicken Sie unter "JAAS-Anmeldemodule" auf Neu und geben Sie für "Name der Modulklasse" den Namen des angepassten Moduls ein. Wählen Sie Proxy für Anmeldemodul verwenden aus, und klicken Sie auf OK.
    7. Klicken Sie auf Neu und geben Sie unter "Name der Modulklasse" den Namen des Anmeldemoduls ein, über dem Sie das angepasste Modul im Stack anordnen. Klicken Sie auf OK.
  4. Konfigurieren Sie den Tokengenerator für Benutzernamenstoken für die Verwendung der neuen JAAS-Konfiguration.
    1. Öffnen Sie in der Administrationskonsole die Bindungskonfiguration, die geändert werden soll.
    2. Wählen Sie WS-Security > Authentifizierung und Zugriffsschutz aus.
    3. Wählen Sie unter "Authentifizierungstoken" das abgehende Benutzernamenstoken aus, das Sie ändern möchten.
    4. Wählen Sie unter "JAAS-Anmeldung" test.generate.unt aus.
    5. Optional: Wenn Sie GenericIssuedTokenGenerateLoginModule verwenden, fügen Sie die angepasste Eigenschaft passThroughToken=true hinzu.
      1. Klicken Sie auf Callback-Handler.
      2. Fügen Sie die angepasste Eigenschaft passThroughToken=true hinzu.
      3. Klicken Sie auf OK.
  5. Klicken Sie auf Speichern.
  6. Starten Sie den Anwendungsserver erneut, um die JAAS-Konfigurationsänderungen anzuwenden.
  7. Testen Sie den Service.

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=twbs_createusertokens
Dateiname:twbs_createusertokens.html