Benutzerdefiniertes Authentifizierungsmodul in OAM und SP

Dieser Artikel erstellt ein neues benutzerdefiniertes Authentifizierungsmodul in OAM/SP, das aus vorhandenen OAM Federation Authentication Plugins und einem benutzerdefinierten Plug-in besteht, das:

Weitere Informationen zum Entwurf eines benutzerdefinierten Authentifizierungs-Plug-ins finden Sie im OAM Developer's Guide, in dem beschrieben wird, wie ein solches Modul entwickelt wird.

Konzentrieren Sie sich auf Folgendes:

Federation-Authentifizierungsmodul

Das OOTB Federation Authentication Module mit dem Namen FederationPlugin besteht aus zwei Plug-ins:

Die Orchestrierung kann wie folgt angezeigt werden:

  1. Gehen Sie zur OAM-Administrationskonsole: http(s)://OAM-admin-host:OAM-adminport/oamconsole.

  2. Navigieren Sie zu Access Manager, Authentication Modules.

  3. Öffnen Sie FederationScheme.

  4. Klicken Sie auf die Registerkarte "Schritte", um die Plug-ins anzuzeigen.

  5. Klicken Sie auf die Registerkarte "Schritte Orchestrierung", um die Orchestrierung zwischen den verschiedenen Plug-ins und dem Plug-in anzuzeigen, mit dem der Vorgang gestartet wird.

Beschreibung der Abbildung Steps_Orchestration_Screen.jpg

FedAuthnRequestPlugin-Plug-in

Die FedAuthnRequestPlugin kann Informationen aus einem vorherigen benutzerdefinierten Authentifizierungs-Plug-in konsumieren, das sich darauf auswirkt, wie der Federation-SSO-Vorgang ausgelöst wird.

Die Instanz AuthenticationContext, die von den Authentifizierungs-Plug-ins gemeinsam verwendet wird, enthält CredentialParam-Objekte, mit denen die verschiedenen Plug-ins zur Laufzeit kommunizieren können.

oracle.security.am.plugin.authn.AuthenticationContext: Kontext für den Authentifizierungsvorgang, der über die verschiedenen Authentifizierungs-Plug-ins hinweg gemeinsam verwendet wird

oracle.security.am.plugin.authn.Credential: Sammlung von Zugangsdaten, die in AuthenticationContext gespeichert sind

oracle.security.am.plugin.authn.CredentialParam: Parameter für einzelne Zugangsdaten, der durch einen Namen referenziert wird und einen Typ aufweist (Zeichenfolge die meiste Zeit). Hat einen Wert, je nach Typ, der in der Zugangsdateninstanz gespeichert ist

Mit diesem Mechanismus kann FedAuthnRequestPlugin verschiedene Informationstypen beim Starten eines Federation-SSO-Vorgangs konsumieren, der in der Zugangsdateninstanz gespeichert ist:

Plugin für benutzerdefinierte Authentifizierung

Überblick

Das benutzerdefinierte Authentifizierungs-Plug-in:

Im Beispiel haben wir:

Diese drei Elemente werden in einer JAR-Datei gebündelt, die dann über die OAM-Administrationskonsole auf den OAM-Server hochgeladen wird. Erstellen Sie nach dem Hochladen und Aktivieren ein Federation Authentication Module.

Java-Klasse

Die Klasse, die mein benutzerdefiniertes Authentifizierungs-Plug-in implementiert, muss die folgenden Anforderungen erfüllen:

Der folgende Code ist ein Beispiel für das benutzerdefinierte Plug-in.

 package userauthn;
 import java.util.Map;
 import oracle.security.am.plugin.ExecutionStatus; import oracle.security.am.plugin.MonitoringData;
 import oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn; import oracle.security.am.plugin.authn.AuthenticationContext; import oracle.security.am.plugin.authn.AuthenticationException; import oracle.security.am.plugin.authn.CredentialParam;
 public class CustomIdPSelectionPlugin extends
 AbstractAuthenticationPlugIn
 {
  public ExecutionStatus process(AuthenticationContext context)
  throws AuthenticationException {
  // requested URL
  String resourceURL = context.getResourceURL();
  // determines the IdP based on the request resource
  String idpPartnerName = null;
  if (resourceURL.startsWith("http://company.com/businesspartners/acmebank"))
  idpPartnerName = "AcmeIdP";
  else if (resourceURL.startsWith("http://company.com/businesspartners/worldbank"))
  idpPartnerName = "WorldBank";
  else if (resourceURL.startsWith("http://company.com/businesspartners/worldinsurance"))
  idpPartnerName = "WInsuranceIdP";
  // if IdP was determined, create a Credential param
  // instance in the AuthenticationContext
  // the OAM/SP FedAuthnRequestPlugin will consume it
 to start Federation SSO if (idpPartnerName != null) {
  CredentialParam idpParam = new
 CredentialParam();
  idpParam.setName("KEY_FEDIDP");
  idpParam.setType("string");
  idpParam.setValue(idpPartnerName);

 context.getCredential().addCredentialParam("KEY_FEDIDP", idpParam);
  }
  // here, the plugin evaluates if the account subpath is being requested
  // if it is, it requests from IdP higher Fed Auth
 Method
  String fedAuthnMethod = null;
  if ("AcmeIdP".equals(idpPartnerName) &&
  resourceURL.startsWith("http://company.com/businesspartners/acmebank/account")) { // AcmeIdP supports X.509 as the higher
 authentication method
  fedAuthnMethod =
 "urn:oasis:names:tc:SAML:2.0:ac:classes:X509";
  } else if ("WorldBank".equals(idpPartnerName) &&
  resourceURL.startsWith("http://company.com/businesspartners/worldbank/account")) // WorldBank supports smart card as the higher
 authentication method
  fedAuthnMethod =
 "urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI";
  } else if ("WInsuranceIdP".equals(idpPartnerName)
 &&
  resourceURL.startsWith("http://company.com/businesspartners/worldinsurance/account"))
  {
  // WInsuranceIdP does not support another fed
 authn method
  }
  // if another fed authn method was requested, create a Credential param
  // instance in the AuthenticationContext
  // the OAM/SP FedAuthnRequestPlugin consumes it to start Federation SSO if (fedAuthnMethod != null) {
  CredentialParam fedAuthnParam = new
 CredentialParam();

 fedAuthnParam.setName("KEY_FEDAUTHNMETHOD")
  fedAuthnParam.setType("string");
  fedAuthnParam.setValue(fedAuthnMethod);

 context.getCredential().addCredentialParam("KEY_FEDAUTHNMETHOD fedAuthnParam);
  }
  // return success, which is mapped to
 FedAuthnRequestPlugin in the
  // Authentication Module steps orchestration
  return ExecutionStatus.SUCCESS;
  }
  public String getPluginName() {
  return "CustomIdPSelectionPlugin";
  }
  public String getDescription() {
  return "Custom IdP Selection Plugin";
  }
  public Map<String, MonitoringData> getMonitoringData() {
  return null;
  }
  public boolean getMonitoringStatus() {
  return false;
  }
  public int getRevision() {
  return 10;
  }
 public void setMonitoringStatus(boolean arg0) {
  } }

Plug-in-Registrierungsdatei

Das benutzerdefinierte Authentifizierungs-Plug-in muss in einer Plug-in-XML-Datei definiert werden. Beispiel:

<Plugin type="Authentication">
<author>uid=admin</author>
<email>admin@example</email>
<creationDate>08:00:00,2014-01-15</creationDate>
<description>Custom IdP Selection
Plugin</description>
<confguration>
</confguration>

Wichtiger Hinweis: Die XML-Datei muss denselben Namen wie die Klasse haben, die das Plug-in implementiert, in diesem Fall CustomIdPSelectionPlugin.XML

Weitere Informationen finden Sie im OAM Developer's Guide

Manifestdatei

Bevor Sie das benutzerdefinierte Authentifizierungs-Plug-in in einer JAR-Datei verpacken, muss ein MANIFEST.MF definiert werden. Beispiel:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CustomIdPSelectionPlugin
Bundle-SymbolicName: CustomIdPSelectionPlugin
Bundle-Version: 10
Bundle-Activator: userauthn.CustomIdPSelectionPlugin Import-Package:
org.osgi.framework;version="1.3.0",oracle.security.am. plugin,oracle.security.am.plugin.authn Bundle-RequiredExecutionEnvironment: JavaSE-1.6

Weitere Informationen finden Sie im OAM Developer's Guide

Hinweis: Die Manifestdatei muss die Eigenschaft ImportPackage enthalten, in der alle im Plug-in verwendeten Packages aufgeführt sind.

Plug-in erstellen

Kompilieren

Die folgenden JAR-Dateien aus dem OAM-Deployment müssen für die Kompilierung verwendet werden:

Diese Dateien befinden sich in den folgenden Speicherorten:

In diesem Beispiel speichern Sie die Datei CustomIdPSelectionPlugin.java in einem src/userautn-Ordner:

bash-4.1$ ls -l src/userauthn/total 4
-rw-r--r-- 1 root root 3894 Mar 1 11:42 CustomIdPSelectionPlugin.java

Führen Sie zum Kompilieren den folgenden Befehl aus:

$JDK_HOME/bin/javac -cp $IAM_HOME/oam/serve/lib/plugin/felix.jar:$IAM_HOME/oam/server/lib/plu /oam-plugin.jar src/userauthn/*.java

Benutzerdefiniertes Plug-in verpacken

Wir haben MANIFEST.MF im aktuellen Verzeichnis basierend auf dem im vorherigen Abschnitt aufgeführten Inhalt und CustomIdPSelectionPlugin.xml im src-Verzeichnis erstellt, das die im vorherigen Abschnitt aufgeführte Plug-in-Definition enthält.

find
.
./MANIFEST.MF
./src
./src/userauthn
./src/userauthn/CustomIdPSelectionPlugin.class
./src/userauthn/CustomIdPSelectionPlugin.java ./src/CustomIdPSelectionPlugin.xm

Um die JAR-Datei CustomIdPSelectionPlugin.JAR zu erstellen, die das Plug-in und die erforderlichen Dateien enthält, führen Sie den folgenden Befehl aus:

jar cfvm CustomIdPSelectionPlugin.jar MANIFEST.MF -C src/ .
added manifest
adding: userauthn/(in = 0) (out= 0)(stored 0%) adding: userauthn/CustomIdPSelectionPlugin.class(in =2717) (out= 1267)(deflated 53%)
adding: userauthn/CustomIdPSelectionPlugin.java(in =3894) (out= 1055)(deflated 72%)
adding: CustomIdPSelectionPlugin.xml(in = 234) (out= 155)(deflated 33%)

Dadurch wird CustomIdPSelectionPlugin.jar erstellt. So zeigen Sie den Inhalt der Datei an:

unzip -l CustomIdPSelectionPlugin.jar Archive: CustomIdPSelectionPlugin.jar
Länge Datum Zeit Name
0 03.01.2014 10:14 META-INF/
425 03.01.2014 10:14 META-INF/MANIFEST.MF
0 03.01.2014 10:13 Uhr Benutzerauthentifizierung/
2717 03.01.2014 10:13 Uhr Benutzerauthentifizierung/CustomIdPSelectionPlugin.class
(3894) 03.01.2014 09:56 Benutzerauthentifizierung/CustomIdPSelectionPlugin.java
234 03.01.2014 10:03 Uhr CustomIdPSelectionPlugin.xml
7270     6 fleisch

Wichtiger Hinweis: Die JAR-Datei muss denselben Namen wie die Klasse haben, die das Plug-in implementiert, in diesem Fall CustomIdPSelectionPlugin.JAR

Benutzerdefiniertes Authentifizierungs-Plug-in bereitstellen

Führen Sie die folgenden Schritte aus, um das benutzerdefinierte Authentifizierungs-Plug-in in OAM bereitzustellen:

  1. Gehen Sie zur OAM-Administrationskonsole: http(s)://OAM-admin-host:OAM-adminport/oamconsole

  2. Navigieren Sie zu Access Manager, Plug-ins.

  3. Klicken Sie auf Plug-in importieren.

  4. Wählen Sie die Plug-in-JAR-Datei (CustomIdPSelectionPlugin.JAR in diesem Beispiel)

Beschreibung der Abbildung Import_Plug-In_Screen.jpg

Das Plug-in befindet sich in einem hochgeladenen Status:

Beschreibung der Abbildung Plug-In_State_Screen.jpg

Sie müssen das Plug-in an die OAM-Laufzeitserver verteilen und aktivieren:

Beschreibung der Abbildung Activation_Status_Screen.jpg

Sie müssen das Plug-in aktivieren:

Beschreibung der Abbildung Activate_Plugin_Screen.jpg

Authentifizierungsmodul erstellen

Erstellen Sie ein neues Federation-Authentifizierungsmodul basierend auf dem vorhandenen FederationPlugin-Authentifizierungsmodul, das sich vom vorhandenen unterscheidet:

Führen Sie die folgenden Schritte aus, um ein neues Authentifizierungsmodul zu erstellen:

  1. Gehen Sie zur OAM-Administrationskonsole: http(s)://OAM-admin-host:OAM-adminport/oamconsole

  2. Navigieren Sie zu Access Manager, Authentication Modules.

  3. Klicken Sie auf Authentifizierungsmodul erstellen.

  4. Wählen Sie Custom Authentication Module erstellen aus.

  5. Geben Sie einen Namen ein (z.B. CustomFedModule)

Beschreibung der Abbildung Authentication_Module_Screen.jpg

Führen Sie die folgenden Schritte aus, um dem neuen Authentifizierungsmodul Schritte hinzuzufügen:

  1. Klicken Sie auf die Registerkarte Steps.

  2. Klicken Sie auf "Hinzufügen", um den Schritt FedAuthnRequestPlugin hinzuzufügen:

    1. Schrittname: FedAuthnRequestPlugin

    2. Plug-in-Name: FedAuthnRequestPlugin

  3. Klicken Sie auf OK.

Beschreibung der Abbildung Authentication_Steps_Screen.jpg

  1. Klicken Sie auf "Hinzufügen", um den Schritt AssertionProcessing hinzuzufügen:

    1. Schrittname: AssertionProcessing

    2. Plug-in-Name: FedUserAuthenticationPlugin

  2. Klicken Sie auf OK.

Beschreibung der Abbildung Assertion_Processing_Screen.jpg

  1. Klicken Sie auf "Hinzufügen", um den Schritt IdPSelection hinzuzufügen:

    1. Schrittname: IdPSelection

    2. Plug-in-Name: CustomIdPSelectionPlugin

  2. Klicken Sie auf OK.

Beschreibung der Abbildung IdP_Selection_Screen.jpg

In der Registerkarte "Schritte" wird Folgendes angezeigt:

Beschreibung der Abbildung Steps_Screen.jpg

Führen Sie die folgenden Schritte aus, um die Schrittorchestrierung für das neue Authentifizierungsmodul zu definieren:

  1. Klicken Sie auf die Registerkarte "Schritte zur Orchestrierung".

  2. Wählen Sie IdPSelection als ersten Schritt aus

  3. Für FedAuthnRequestPlugin:

    1. Erfolgreich für "Bei Erfolg" auswählen

    2. Wählen Sie AssertionProcessing für "Bei Fehler" aus

    3. Fehler für "Bei Fehler" auswählen

  4. Für AssertionProcessing:

    1. Erfolgreich für "Bei Erfolg" auswählen

    2. Fehler für "Bei Fehler" auswählen

    3. Fehler für "Bei Fehler" auswählen

  5. Für IdPSelection:

    1. Wählen Sie FedAuthnRequestPlugin für "Bei Erfolg" aus

    2. Fehler für "Bei Fehler" auswählen

    3. Fehler für "Bei Fehler" auswählen

  6. Klicken Sie auf Apply.

Beschreibung der Abbildung Define_steps_orchestration_Screen.jpg

Authentifizierungsschema

Bevor Ressourcen mit einer Authentifizierungs-Policy geschützt werden können, die dieses neue Authentifizierungsmodul verwendet, muss ein neues Authentifizierungsschema erstellt werden, das dieses neue benutzerdefinierte Modul referenziert. Dies ist erforderlich, da die Authentifizierungs-Policy an ein Authentifizierungsschema und nicht an ein Authentifizierungsmodul gebunden ist.

Um ein neues Authentifizierungsschema für dieses benutzerdefinierte Modul zu erstellen, gehen Sie wie folgt vor:

  1. Gehen Sie zur OAM-Administrationskonsole: http(s)://OAM-admin-host:OAM-adminport/oamconsole

  2. Navigieren Sie zu Access Manager, Authentifizierungsschemas.

  3. Klicken Sie auf Authentifizierungsschema erstellen.

  4. Geben Sie einen Namen (z.B. CustomFedScheme) und eine Beschreibung ein

  5. Stellen Sie die Authentifizierungsebene auf einen zulässigen Wert ein (in meinem Beispiel 2). Wählen Sie FORM als Challenge-Methode aus

  6. Legen Sie die Challenge-Umleitungs-URL fest (in diesem Beispiel wird sie auf /oam/server/ gesetzt)

  7. Wählen Sie das neu erstellte benutzerdefinierte Authentifizierungsmodul aus (CustomFedModule im Beispiel)

  8. Stellen Sie die Challenge-URL ein (/pages/servererror.jsp in diesem Beispiel)

  9. Kontexttyp festlegen (z.B. customWar) Kontextwert festlegen (/oam hier, da keine Seiten verwendet werden)

  10. Geben Sie mindestens Folgendes für die Challenge-Parameter ein: initial_command=NONE is_rsa=true

  11. Klicken Sie auf Apply.

Beschreibung der Abbildung Authentication_Scheme_Screen.jpg

Testen

Schützen Sie eine Ressource mit einer Authentifizierungs-Policy mit dem neu erstellten Authentifizierungsschema. Dadurch wird das benutzerdefinierte Authentifizierungsmodul aufgerufen.

Weitere Lernressourcen

Sehen Sie sich weitere Übungen unter docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning-Kanal YouTube zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.