Web-Service-Anwendungen für die Verwendung eines Benutzernamenstokens ohne Registry-Interaktion entwickeln

Damit ein Benutzernamenstoken mit einem Callerabschnitt authentifiziert werden kann, ohne dass ein Zugriff auf die WebSphere-Registry erforderlich ist, können Sie die Authentifizierungsmethode des Benutzernamenstokenkonsumenten ersetzen und den Caller so konfigurieren, dass er eine alternative JAAS-Anmeldekonfiguration (Java™ Authentication and Authorization Service) verwendet.

Informationen zu diesem Vorgang

Diese Informationen gelten nur für JAX-RPC-Web-Services (Java API for XML-based RPC).

Das Standard-JAAS-Anmeldemodul UsernameLoginModule, das standardmäßig von dem Web Services Security-Benutzernamenstokenkonsumenten verwendet wird, ist so definiert, dass es den Benutzernamen und das Kennwort, die im Token enthalten sind, immer anhand der WebSphere-Registry validiert. Sie können eine angepasste Eigenschaft definieren, um diese Registry-Prüfung zu umgehen. Wenn den WS-Security-Vorgaben für einen Service-Provider einen Callerabschnitt hinzugefügt wird, werden der Benutzername und das Kennwort, die im Benutzernamenstoken enthalten sind, ebenfalls anhand der WebSphere-Registry validiert. Diese Validierung findet im Modul com.ibm.ws.security.server.lm.ltpaLoginModule statt. Dieses Modul ist, wie im folgenden Beispiel gezeigt, Teil des JAAS-Konfigurationsstack system.DEFAULT.

com.ibm.ws.security.server.lm.ltpaLoginModule
com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule

Die Verwendung einer JAAS-Konfiguration für den Callerabschnitt, in der diese beiden Anmeldemodule nicht enthalten sind, wird von der WS-Security-Laufzeit von WebSphere Application Server nicht unterstützt. Es ist jedoch möglich, eigene angepasste Anmeldemodule in diesen JAAS-Konfigurationsstack aufzunehmen.

Damit Sie ein Benutzernamenstoken mit einem Callerabschnitt verwenden können, ohne auf die WebSphere Application Server-Registry zuzugreifen, müssen Sie verhindern, dass die Module UsernameLoginModule und ltpaLoginModule auf die Registry zugreifen.
Anmerkung: Wenn einer Provideranwendung über den Assistenten in einem Anwendungsentwickler ein Benutzernamenstoken hinzugefügt wird, fügt diese automatisch einen Callerabschnitt für das Benutzernamenstoken hinzu. Ein Callerabschnitt wird nur dann benötigt, wenn die Identität aus dem Benutzernamenstoken im Ausführungsthread enthalten sein soll. Wenn es für Ihre Anwendung nicht erforderlich ist, dass die Identität aus dem Benutzernamenstoken im Ausführungsthread enthalten ist, benötigen Sie den Callerabschnitt nicht und können diesen entfernen. Der Callerabschnitt wird in den Erweiterungen des Implementierungsdeskriptors konfiguriert. Sie können nur über einen Anwendungsentwickler darauf zugreifen.

Weitere Informationen finden Sie im Information Center von IBM Rational Application Developer im Artikel über die Konfiguration des Callers in den Sicherheitsvorgaben des Konsumenten.

Vorgehensweise

  1. Um zu verhindern, dass das Modul UsernameLoginModule auf die Registry zugreift, fügen Sie die angepasste Eigenschaft com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck zur JAAS-Konfiguration für den Benutzernamenstokenkonsumenten hinzu. Diese angepasste Eigenschaft kann auf zwei Arten hinzugefügt werden:
    Fehler vermeiden Fehler vermeiden: Die Aktualisierung der JAAS-Konfiguration wssecurity.UsernameToken führt dazu, dass für alle Benutzer dieser JAAS-Konfiguration auf dem Anwendungsserver keine Registry-Prüfung durchgeführt wird. Wenn dieses Verhalten nicht erwünscht ist, erstellen Sie eine neue JAAS-Konfiguration oder verwenden Sie die Methode zum Aktualisieren des Benutzernamenstokenkonsumenten.gotcha

    Gehen Sie wie folgt vor, um die angepasste Eigenschaft dem Modul com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule in der JAAS-Konfiguration wssecurity.UsernameToken hinzuzufügen:

    1. Klicken Sie auf Sicherheit > Globale Sicherheit.
    2. Klicken Sie unter Authentifizierung auf Java Authentication and Authorization Service > Systemanmeldungen.
    3. Wählen Sie wssecurity.UsernameToken aus.
    4. Wählen Sie com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule aus.
    5. Fügen Sie die folgende angepasste Eigenschaft hinzu: com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true.
    6. Klicken Sie auf OK.
    7. Starten Sie den Anwendungsserver erneut, um die aktualisierte JAAS-Konfiguration erneut zu laden:

    Führen Sie die folgenden Schritte aus, um die angepasste Eigenschaft dem Tokenkonsumenten der Anwendung hinzuzufügen:

    1. Klicken Sie auf Anwendungen > Anwendungstypen > WebSphere-Unternehmensanwendungen > (Name_der_Provideranwendung) > Module verwalten > (Modulname) > Web-Services: Serversicherheitsbindungen.
    2. Klicken Sie unter der Bindung Anforderungskonsument (Empfänger) auf Angepasste Bindung bearbeiten > Tokenkonsumenten.
    3. Wählen Sie Ihren Benutzernamenstokenkonsumenten aus.
    4. Klicken Sie auf JAAS-Konfiguration > Eigenschaften > Neu.
    5. Fügen Sie die folgende angepasste Eigenschaft hinzu: com.ibm.wsspi.wssecurity.auth.module.UsernameLoginModule.disableUserRegistryCheck=true.
    6. Klicken Sie auf OK.
    7. Klicken Sie auf Speichern.
    8. Starten Sie die Anwendung erneut.
    Anmerkung: Wenn als Name des Benutzernamenstokenkonsumenten ein Eintrag wie "Token_123" angezeigt wird, der nicht auswählbar ist, dann konnte der Anwendungsentwickler, der zum Hinzufügen Ihrer Sicherheitsvorgaben verwendet wurde, im Implementierungsdeskriptor keinen Namen für Ihren Tokenkonsumenten festlegen. Alternativ können Sie einen der folgenden beiden Schritte ausführen:
    1. Fügen Sie die Eigenschaft wie in Schritt 1 beschrieben der JAAS-Sicherheitskonfiguration hinzu.
    2. Verwenden Sie einen Anwendungsentwickler, um die Implementierungsdeskriptorbindungen in Ihrem Anwendungsprojekt zu bearbeiten.
    Weitere Informationen finden Sie im Information Center von IBM Rational Application Developer im Artikel zur Konfiguration des Sicherheitstokens in Sicherheitsvorgaben des Konsumenten.
  2. Entwickeln Sie ein JAAS-Anmeldemodul, das im Stack über dem Modul com.ibm.ws.security.server.lm.ltpaLoginModule angeordnet ist. Nachfolgend sehen Sie Beispielcode für das JAAS-Anmeldemodul:
    package test.tokens;
    import java.util.Map;
    import java.util.Hashtable;
    
    import javax.security.auth.Subject;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    import javax.security.auth.callback.NameCallback;
    import javax.security.auth.callback.PasswordCallback;
    import javax.security.auth.callback.Callback;
    import javax.security.auth.callback.CallbackHandler;
    import com.ibm.wsspi.wssecurity.auth.token.UsernameToken;
    import com.ibm.wsspi.security.token.AttributeNameConstants;
    
    public class MyAuthLoginModule implements LoginModule {
    
    	  private Map _sharedState = null;
    	  private CallbackHandler _callbackHandler = null;
    	  Subject _subject = null;
    
    
    	public void initialize(Subject subject, CallbackHandler callbackHandler,
                  Map<String, ?> sharedState, Map<String, ?> options) {
    	    this._sharedState = sharedState;
    	    this._callbackHandler = callbackHandler;
    	    this._subject = subject;		
    	}
    
    	public boolean login() throws LoginException {
    	    //Aus Gründen der Lesbarkeit ist dieses Anmeldemodul so
      //aufgebaut, dass es nicht vor allen Nullzeigerausnahmen (NPEs) schützt
    
    	    	String username = null;
    	    char [] password = null;
    	    NameCallback nameCallback = null;
    	    PasswordCallback passwordCallback = null;
    
    	    //Benutzernamen und Kennwort aus Callbacks abrufen, die von
    	    //der WS-Security-Laufzeit definiert wurden
    	    Callback[] callbacks = new Callback[2];
    	    callbacks[0] = nameCallback = new NameCallback("Username: ");
    	    callbacks[1] = passwordCallback = new PasswordCallback("Password: ", false);
    	    try  {    
    	      _callbackHandler.handle(callbacks);
    	    } catch (Exception e)  {
    	      throw new LoginException("Unable to process callbacks");
    	    }
    
    	    if (nameCallback != null) {
    	      username = nameCallback.getName();
    	    }
    
    	    if (passwordCallback != null) {
    	      char tmp[] = passwordCallback.getPassword();
    	      if (tmp != null && tmp.length != 0) {
    	        password = new char[tmp.length];
    	        System.arraycopy(tmp, 0, password, 0, tmp.length);
    	      }
    	    }
    
    	    	if (username == null) {
    	      	  throw new LoginException("Unable to obtain username");
    	    }
    
    	    //Sollen Benutzernamen und Kennwort validiert werden,
    	    //hier validieren
    
    	    	Hashtable customProperties = (Hashtable)_sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
    	    if (customProperties == null) {
    	      	  customProperties = new Hashtable();
    	     _sharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY, customProperties);
    	    }
    
    	   // Hier wird der Standardrealm verwendet, aber jeder vertrauenswürdige Realm kann verwendet werden
    	   String uid = "defaultWIMFileBasedRealm/" + username;
    	   customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uid)
    	   	// SECURITYNAME ist der Name des Principals
    	   customproperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
    
    	    return true;
    	  }
    
    	public boolean logout() throws LoginException {
    		return false;
    	}
    
    }
  3. Erstellen Sie eine JAAS-Anmeldekonfiguration.
    1. Klicken Sie in der Administrationskonsole auf Sicherheit > Globale Sicherheit.
    2. Wählen Sie unter "Authentifizierung" die Optionen Java Authentication and Authorization Service > Systemanmeldungen aus.
    3. Klicken Sie auf Neu und geben Sie unter Alias den Eintrag test.auth.jaxrpcunt ein.
    4. Fügen Sie die JAAS-Anmeldemodule hinzu. Die folgenden Anmeldemodule müssen in der angegebenen Reihenfolge hinzugefügt werden:
      test.tokens.MyAuthLoginModule
      Anmerkung: Der Name dieses Moduls muss mit dem Namen des JAAS-Anmeldemoduls, das Sie entwickelt haben, übereinstimmen.
      com.ibm.ws.security.server.lm.ltpaLoginModule
      com.ibm.ws.security.server.lm.wsMapDefaultInboundLoginModule

      Gehen Sie für jedes Anmeldemodul wie folgt vor:

      1. Klicken Sie unter JAAS-Anmeldemodule auf Neu.
      2. Geben Sie unter Name der Modulklasse den Namen des Anmeldemoduls ein.
      3. Wählen Sie nur für test.tokens.MyAuthLoginModule die Option Proxy für Anmeldemodul verwenden aus.
      4. Klicken Sie auf OK.
      5. Klicken Sie auf OK und anschließend auf Speichern.
  4. Starten Sie den Anwendungsserver erneut, um die JAAS-Konfigurationsänderungen anzuwenden.
  5. Konfigurieren Sie den Callerabschnitt für die Verwendung der neuen JAAS-Konfiguration. Sie können Ihren Callerabschnitt nur über einen Anwendungsentwickler konfigurieren. Weitere Informationen finden Sie im Information Center von IBM Rational Application Developer im Artikel über die Konfiguration des Callers in den Sicherheitsvorgaben des Konsumenten.
    • Fügen Sie dem Callerabschnitt für das Benutzernamenstoken die folgende angepasste Eigenschaft hinzu: com.ibm.wsspi.wssecurity.Caller.assertionLoginConfig=system.test.auth.jaxrpcunt.
    • Speichern Sie den Implementierungsdeskriptor.
    • Implementieren Sie die Anwendung erneut auf dem Server.
  6. 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_usernametokennoreg
Dateiname:twbs_usernametokennoreg.html