JIT-Benutzer-Provisioning in OAM und SP fortgesetzt

Dieser Artikel zeigt, wie ein benutzerdefiniertes Benutzer-Provisioning-Modul in OAM/SP erstellt wird. Dies basiert auf dem OAM Developer's Guide, Kapitel 16, in dem beschrieben wird, wie ein solches Modul entwickelt wird.

In diesem Artikel konzentrieren Sie sich auf Folgendes:

In diesem Beispiel verwenden Sie den im OAM Developer's Guide aufgeführten Beispielcode.

Benutzerdefiniertes Benutzer-Provisioning-Modul

Das Benutzer-Provisioning-Framework ermöglicht die Implementierung eines benutzerdefinierten Plug-ins, das die vom Framework definierten Schnittstellen implementiert.

Ein benutzerdefiniertes Benutzer-Provisioning-Plug-in besteht aus:

Diese drei Elemente werden in einer JAR-Datei gebündelt, die dann über die OAM-Administrationskonsole auf den OAM-Server hochgeladen wird. Nach dem Hochladen und Aktivieren kann sie zur Laufzeit von OAM/SP verwendet werden.

Java-Klasse

Die Klasse, die das benutzerdefinierte Benutzer-Provisioning-Modul implementiert, muss die folgenden Anforderungen erfüllen:

Der folgende Code ist ein Beispiel für das benutzerdefinierte Plug-in mit dem Namen CustomerUserProvisioning.

package userprov;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Map;
import javax.naming.Context;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.InitialDirContext;
import oracle.security.am.plugin.ExecutionStatus;
import oracle.security.am.plugin.MonitoringData;
import oracle.security.am.plugin.PluginConfig;
import oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin;
import oracle.security.fed.plugins.fed.provisioning.UserContext;
import oracle.security.fed.plugins.fed.provisioning.UserProvisioningException;


public class CustomUserProvisioning extends OIFUserProvisioningPlugin implements
org.osgi.framework.BundleActivator
{
	private String userBaseDN = null;
	public ExecutionStatus initialize(PluginConfig config)
	{
	ExecutionStatus status = super.initialize(config);
	if (status.getStatus() == ExecutionStatus.SUCCESS.getStatus())
		userBaseDN = (String)config.getParameter("USER_BASE_DN");
		return status;
	}
public ExecutionStatus process(UserContext  context) throws UserProvisioningException
{
	try
	{
		// get user data
	 // after OIF/SP processing of the attributes sent by the IdP, we expect
// givenname, sn, mail as well as fed.nameidvalue which contains
// the userid
		Map assertionAbributes = context.getAttributes();
		Collection collection = (Collection)assertionAbributes.get("givenname");
		String firstname = (String)(collection.size() > 0 ? collection.iterator().next() : null);
		collection =  (Collection)assertionAbributes.get("sn");
		String lastname = (String)(collection.size() > 0 ? collection.iterator().next() : null);
		collection = (Collection)assertionAbributes.get("mail");
		String email = (String)(collection.size() > 0 ? collection.iterator().next() : null);
		collection =  (Collection)assertionAbributes.get("fed.nameidvalue"); String userid = (String)(collection.size() > 0 ?
collection.iterator().next() : null);

// check that the required attributes are present. If not, return an error

if (firstname == null || firstname.length() == 0 || lastname == null || lastname.length() == 0 ||  email == null || email.length() == 0 ||
userid == null || userid.length() == 0)
	{

	// failure
		return ExecutionStatus.FAILURE;
	}
	String ldap = "ldap://adc00pcc.us.oracle.com:11389";
	String username = "cn=orcladmin"; String password = "welcome1";

// connects to the LDAP directory

		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.PROVIDER_URL, ldap);

		if (ldap.toLowerCase().startsWith("ldaps"))
			env.put(Context.SECURITY_PROTOCOL, "ssl");
			env.put(Context.SECURITY_AUTHENTICATION,"simple");
			env.put(Context.REFERRAL, "follow"); env.put(Context.SECURITY_PRINCIPAL, username);
			env.put(Context.SECURITY_CREDENTIALS, password);

		InitialDirContext ldapContext = new

		InitialDirContext(env);

// create the user entry

		BasicAttributes attributes = new

		BasicAttributes();

// object classes

		BasicAttribute objClassAbr = new

		BasicAttribute("objectClass");

		objClassAbr.add("person");

		objClassAbr.add("organizationalPerson");

		objClassAbr.add("inetOrgPerson");

		objClassAbr.add("top");

		attributes.put(objClassAbr);

// uid abr

		attributes.put(new BasicAttribute("uid", userid));

// first name

		attributes.put(new BasicAttribute("givenname", firstname));

// last name

		attributes.put(new BasicAttribute("sn", lastname));

// email

		attributes.put(new BasicAttribute("mail", email));

// DN: cn will be set to userID

		String dn = "cn=" + userid + (userBaseDN != null && userBaseDN.length() \> 0 ? "," + userBaseDN : "");

// create the user record

		ldapContext.createSubcontext(dn, attributes);

// return success

		return ExecutionStatus.SUCCESS;

	}

catch (Exception ex)

	{
		ex.printStackTrace();
		return ExecutionStatus.FAILURE;

	}
}

	public String getPluginName()
	{
		return "CustomProvisioningPlugin";
	}
	public String getDescription()
	{
		return "Custom Provisioning Plugin";
	}
	public Map<String, MonitoringData> getMonitoringData()
	{
		return null;
	}
	public boolean getMonitoringStatus()
	{
		return false;
	}
	public int getRevision()
	{
		return 10;
	}
	public void setMonitoringStatus(boolean status)
	{

	}
	public void start(BundleContext arg0) throws Exception
	{

	}
	public void stop(BundleContext arg0) throws  Exception

	{

	}

}

Plug-in-Registrierungsdatei

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

<Plugin type="User Provisioning">
<author>uid=admin</author>
<email>admin@example</email>
<creationDate>08:00:00,2014-01-15</creationDate>
<description>Custom Provisioning Plugin</description>
 <configuration>
   <AbributeValuePair>
     <Attribute type="string" length="100">USER_BASE_DN</Abribute> <mandatory>false</mandatory>
     <instanceOverride>false</instanceOverride>
     <globalUIOverride>false</globalUIOverride>
     <value> </value>
  </AbributeValuePair>
</configuration>
</Plugin>

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

Weitere Informationen finden Sie im OAM Developer's Guide.

Manifestdatei

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

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CustomUserProvisioning
Bundle-SymbolicName: CustomUserProvisioning
Bundle-Version: 10
Bundle-Activator: userprov.CustomUserProvisioning Import-Package: org.osgi.framework;version="1.3.0",oracle.security.fed
.plugins.fed.provisioning,javax.naming,javax.naming.directory,oracle. security.am.plugin
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 Packages aufgeführt werden, die im Plug-in verwendet werden.

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:

Führen Sie zum Kompilieren den folgenden Befehl aus:

$JDK_HOME/bin/javac -cp $IAM_HOME/oam/server/lib/plugin/felix.jar:$IAM_HOME/oam/server/lib/plugin/oam-plugin.jar:/tmp/oam-server/APPINF/lib/fed.jar src/userprov/*.java

Benutzerdefiniertes Plug-in verpacken

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

find
.
./MANIFEST.MF
./src
./src/userprov
./src/userprov/CustomUserProvisioning.class
./src/userprov/CustomUserProvisioning.java ./src/CustomUserProvisioning.xml

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

jar cfvm CustomUserProvisioning.jar MANIFEST.MF -C src/ .
added manifest adding: userprov/(in = 0) (out= 0)(stored 0%) adding: userprov/CustomUserProvisioning.class(in =3991) (out= 1954)(de_ated 51%)
adding: userprov/CustomUserProvisioning.java(in =4717) (out= 1401)(de_ated 70%)
adding: CustomUserProvisioning.xml(in = 486) (out= 266)(de_ated 45%)

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

unzip -l CustomUserProvisioning.jar Archiv: CustomUserProvisioning.jar

Länge Datum Zeit Name
0 03.01.2014 14:32 META-INF/
404 03.01.2014 14:32 META-INF/MANIFEST.MF
0 03.01.2014 12:10 Uhr Benutzerprov./
(3991) 03.01.2014 12:10 Uhr userprov/CustomUserProvisioning.class
(4717) 03.01.2014 11:42 userprov/CustomUserProvisioning.java
486 03.01.2014 14:04 Uhr CustomUserProvisioning.xml
(9598)     6 Dateien

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

Benutzerdefinierte Provisioning-Module bereitstellen

Führen Sie die folgenden Schritte aus, um das benutzerdefinierte Benutzer-Provisioning-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 JAR-Datei des Plug-ins (in diesem Beispiel CustomUserProvisioning.JAR).

Beschreibung der Abbildung Import_Plugin.jpg

Das Plug-in befindet sich in einem hochgeladenen Status:

Beschreibung der Abbildung Plugin_Screen.jpg

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

  1. Wählen Sie das Plugin aus.

  2. Klicken Sie auf "Auswahl verteilen".

  3. Auf der Registerkarte "Aktivierungsstatus" des Plug-ins wird der Status des Plug-ins angezeigt.

Beschreibung der Abbildung Plugin_Status.jpg

Sie müssen das Plug-in aktivieren:

  1. Wählen Sie das Plugin aus.

  2. Klicken Sie auf "Aktivieren".

  3. Auf der Registerkarte "Aktivierungsstatus" des Plug-ins wird der Status des Plug-ins angezeigt.

Beschreibung der Abbildung Activation_Status.jpg

Schließlich muss das Plug-in für den Benutzerbasis-DN konfiguriert sein. Gehen Sie wie folgt vor:

  1. Wählen Sie das Plugin aus.

  2. Klicken Sie auf die Registerkarte Konfigurationsparameter des Plug-ins.

  3. Geben Sie den Basis-DN des Benutzers ein (z.B. für das verwendete Verzeichnis: ou=users,dc=us,dc=oracle,dc=com).

  4. Klicken Sie auf Speichern.

Beschreibung der Abbildung Configure_Plugin.jpg

Benutzerdefiniertes Benutzer-Provisioning-Modul verwenden

Benutzer-Deployment in OAM aktivieren

So aktivieren/deaktivieren Sie das Benutzer-Provisioning in OAM/SP:

  1. Geben Sie die WLST-Umgebung ein, indem Sie Folgendes ausführen: $IAM_ORACLE_HOME/common/bin/WLST.sh.

  2. Stellen Sie eine Verbindung zum WLS-Admin-Server her: connect().

  3. Navigieren Sie zur Domainlaufzeitverzweigung: domainRuntime().

  4. Ändern Sie die Eigenschaft userprovisioningenabled in:

  5. Benutzer-Provisioning in OAM/SP aktivieren: putBooleanProperty("/fedserverconfig /userprovisioningenabled", "true")

  6. Benutzer-Provisioning in OAM/SP deaktivieren: putBooleanProperty("/fedserverconfig /userprovisioningenabled", "false")

  7. Beenden Sie die WLST-Umgebung: exit().

OAM für die Verwendung des benutzerdefinierten Plug-ins konfigurieren

So konfigurieren Sie OAM/SP für die Verwendung des benutzerdefinierten Plug-ins:

  1. Geben Sie die WLST-Umgebung ein, indem Sie Folgendes ausführen: $IAM_ORACLE_HOME/common/bin/WLST.sh.

  2. Stellen Sie eine Verbindung zum WLS-Admin-Server her: connect().

  3. Navigieren Sie zur Domainlaufzeitverzweigung: domainRuntime().

  4. Aktualisieren Sie die Eigenschaft userprovisioningplugin in: Konfigurieren Sie OAM so, dass das benutzerdefinierte Plug-in verwendet wird. Setzen Sie die Eigenschaft auf den Plug-in-Namen (in unserem Beispiel CustomUserProvisioning): putStringProperty("/fedserverconfig/userprovisioningplugin","CustomUserProvisioning")

  5. OAM für die Verwendung des integrierten Benutzer-Provisioning-Moduls konfigurieren: putStringProperty("/fedserverconfig /userprovisioningplugin","FedUserProvisioningPlugin")

  6. Beenden Sie die WLST-Umgebung: exit().

Testsetup

Verwenden Sie dasselbe SAML 2.0 Federation-Setup, das zuvor konfiguriert wurde. Dabei gilt:

Während eines SAML 2.0-Föderations-SSO mit dem Remote-IdP-Partner lautet die XML-SAML-Antwort mit der von der IdP zurückgesendeten Assertion wie folgt:

<samlp:Response ..>
 <saml:Issuer ...>http://acme.com/idp</saml:Issuer>
 <samlp:Status>
   <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<saml:Assertion ...>
<saml:Issuer ...>http://acme.com/idp</saml:Issuer>
<dsig:Signature ...>
 ...
</dsig:Signature>
<saml:Subject>
<saml:NameID ...>alice</saml:NameID>
...
</saml:Subject>
<saml:Conditions ...>
 ...
</saml:Conditions>
<saml:AuthnStatement ...>
...
</saml:AuthnStatement>
<saml:AbributeStatement ...>
<saml:Attribute Name="email" ...>
 <saml:AbributeValue ...>alice@oracle.com</saml:AbributeValue>
</saml:Abribute>
<saml:Attribute Name="title" ...>
<saml:AbributeValue ...>manager</saml:AbributeValue>
</saml:Abribute>
<saml:Attribute Name="surname" ...>
<saml:AbributeValue ...>Appleton</saml:AbributeValue>
</saml:Abribute>
<saml:Attribute Name="fname" ...>
<saml:AbributeValue ...>Alice</saml:AbributeValue>
</saml:Abribute>
</saml:AbributeStatement>
</saml:Assertion>
</samlp:Response>

Das Ergebnis der Verarbeitung der SAML 2.0-Assertion durch OAM/SP zeigt die transformierten Attribute sowie die NameID

Beschreibung der Abbildung Operation_Result.jpg

Testen

Nach dem Federation-SSO wurde der Benutzerdatensatz für Alice erstellt:

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.