Module personnalisé de post-authentification dans OAM et SP

Cet article explique comment implémenter un module d'extension d'authentification personnalisé qui sera appelé une fois l'authentification SSO de fédération terminée et qui :

Pour plus d'informations sur la conception d'un module d'extension d'authentification personnalisé, reportez-vous au guide du développeur OAM, chapitre 3, qui décrit comment développer un tel module : http://docs.oracle.com/cd/E40329_01/dev.1112/e27134/authnapi.htm. Concentrons-nous sur les méthodes suivantes :

Module d'authentification de fédération

Remarque importante : lors de l'utilisation de l'application de fournisseur de services de test Federation, le module d'authentification est ignoré et, par conséquent, les modules d'extension définis dans ce type de module ne seront pas exécutés.

Voici un module d'authentification OAM :

Le module d'authentification de fédération OOTB, appelé FederationPlugin, est composé de deux modules d'extension :

L'orchestration peut être vue par :

  1. Accédez à la console d'administration OAM : http(s)://oam-adminhost:oam-admin-port/oamconsole.
  2. Accédez à Access Manager, Modules d'authentification.
  3. Ouvrez FederationScheme.
  4. Cliquez sur l'onglet Etapes pour voir les modules d'extension.
  5. Cliquez sur l'onglet Orchestration des étapes pour voir l'orchestration entre les différents modules d'extension et le module d'extension utilisé pour démarrer l'opération.

Description de l'image Federation_Plugin_Screen.png

Module d'extension AssertionProcessing

Le module d'extension AssertionProcessing est responsable de la validation et de la consommation d'une assertion SSO entrante, de la mise en correspondance de l'assertion avec un enregistrement utilisateur LDAP local et renvoie l'identité de l'utilisateur ainsi que le contenu de l'assertion à OAM. L'instance AuthenticationContext partagée entre les modules d'extension d'authentification contient des objets CredentialParam qui permettent aux différents modules d'extension de communiquer lors de l'exécution, ainsi que le résultat de l'opération d'authentification.

Données de contexte d'authentification

En cas de réussite de l'authentification, un module d'extension d'authentification OAM renvoie les données suivantes dans AuthenticationContext :

Instances CredentialParam suivantes contenues dans l'objet d'informations d'identification de AuthenticationContext

Les instances PluginResponse suivantes contenues dans AuthenticationContext :

Nom de la banque d'identités où se trouve l'enregistrement utilisateur

Niveau d'authentification s'il a été remplacé lors du traitement du fournisseur de services de fédération (voir cet article pour plus d'informations : Art 27 - Mise en correspondance de la méthode Fed Authn avec les niveaux Authn dans le fournisseur de services OAM)

Données d'assertion, chaque élément étant une instance PluginResponse autonome :

Les données contenues dans AuthenticationContext sont utilisées par OAM pour un traitement ultérieur.

Les données d'assertion sont constituées des éléments suivants :

Exemple

Prenons l'exemple suivant pour examiner les données renvoyées par le module d'extension AssertionProcessing à la fin du flux :

Le partenaire IdP dans OAM/SP est lié à un profil d'attribut IdP avec une seule entrée, qui met en correspondance l'UID de nom d'attribut SAML avec l'UID de nom d'attribut de session OAM. Dans l'exemple, l'utilisateur de test sera l'un des deux suivants :

Voici un exemple d'assertion SAML 2.0 :

<samlp:Response ..>
     <saml:Issuer ...>hLp://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 ...>hLp://acme.com/idp</saml:Issuer>
         <dsig:Signature ...>
         ...
         </dsig:Signature>
         <saml:Subject>
 <saml:NameID ...>alice@oracle.com</saml:NameID>
             ...
         </saml:Subject>         <saml:Conditions ...>
          ...
         </saml:Conditions>         <saml:AuthnStatement ...>
         ...
         </saml:AuthnStatement>
         <saml:AttributeStatement ...>
             <saml:Attribute Name="userid" ...>
                 <saml:AttributeValue ...>alice</saml:AttributeValue>
             </saml:Attribute>
             <saml:Attribute Name="lastname" ...>
                 <saml:AttributeValue ...>Appleton</saml:AttributeValue>             </saml:Attribute>
             <saml:Attribute Name="firstname" ...>
                 <saml:AttributeValue ...>Alice</saml:AttributeValue>
             </saml:Attribute>
         </saml:AttributeStatement>
     </saml:Assertion>
 </samlp:Response>

Après le traitement de l'assertion SAML 2.0 et la mise en correspondance de la réponse SSO entrante avec un enregistrement utilisateur local, le module d'extension AssertionProcessing renvoie à OAM le fichier AuthenticationContext avec les données suivantes : Objet contenant :

Instances CredentialParam suivantes contenues dans l'objet d'informations d'identification de AuthenticationContext

Les instances PluginResponse suivantes contenues dans AuthenticationContext :

Module d'extension d'authentification personnalisée

Présentation

Dans cet article, supposons que le déploiement OAM/SP doit prendre en charge :

Utilisation d'un module Just-In-Time User Provisioning qui prend en charge #1. Pour répondre aux exigences de #2, un plug-in d'authentification personnalisé est nécessaire qui :

Pour cet exemple, l'environnement est constitué des éléments suivants :

Le module d'extension d'authentification personnalisé est constitué des éléments suivants :

Ces trois éléments sont regroupés dans un fichier JAR qui est ensuite téléchargé vers le serveur OAM via la console d'administration OAM. Une fois téléchargé et activé, modifiez le module d'authentification de fédération.

Classe Java

La classe implémentant le plug-in d'authentification personnalisé doit respecter les règles suivantes :

Le code suivant est un exemple de plug-in personnalisé.

package postsp;
 import java.util.Hashtable;
 import java.util.Map;
 import java.util.Set;
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.InitialDirContext;
 import javax.security.auth.Subject;
 import oracle.security.am.common.utilities.principal.OAMUserDNPrincipal;
 import oracle.security.am.common.utilities.principal.OAMUserPrincipal;
 import oracle.security.am.plugin.ExecutionStatus;
 import oracle.security.am.plugin.MonitoringData;
 import oracle.security.am.plugin.PluginAttributeContextType;
 import oracle.security.am.plugin.PluginResponse;
 import oracle.security.am.plugin.authn.AbstractAuthenticationPlugIn;
 import oracle.security.am.plugin.authn.AuthenticationContext;
 import oracle.security.am.plugin.authn.AuthenticationException;
 public class CustomAttributesUpdatePlugin extends
 AbstractAuthenticationPlugIn
 {
   public ExecutionStatus process(AuthenticationContext context)
               throws AuthenticationException {
     // user's ID and DN. Note: we are not making necessary checks for size/null to
     // keep the sample code minimal.
     Subject subject = context.getSubject();
     Set<OAMUserPrincipal> principalsUserID =
               subject.getPrincipals(OAMUserPrincipal.class);
     Set<OAMUserDNPrincipal> principalsDN =
               subject.getPrincipals(OAMUserDNPrincipal.class);
     String localUserID =
 (String)principalsUserID.iterator().next().getName();
     String localUserDN = (String)principalsDN.iterator().next().getName();
     // get the assertion data. Note: We are not making necessary checks for size/null to
     // keep the sample code minimal.
     PluginResponse partnerResponse = context.getResponse(               PluginAttributeContextType.SESSION, "fed.partner");
     String partnerName = (String)partnerResponse.getValue();     PluginResponse nameIDResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.nameidvalue");
     String nameID = (String)nameIDResponse.getValue();
     PluginResponse uidResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.aLr.uid");
     String uid = (String)uidResponse.getValue();
     PluginResponse firstnameResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.aLr.firstname");
     String firstname = (String)firstnameResponse.getValue();     PluginResponse lastnameResponse = context.getResponse(
               PluginAttributeContextType.SESSION, "fed.aLr.lastname");
     String lastname = (String)lastnameResponse.getValue();
     try {
       // open ldap connection
       Hashtable env = new Hashtable();
       env.put(Context.INITIAL_CONTEXT_FACTORY,
 "com.sun.jndi.ldap.LdapCtxFactory");
       env.put(Context.PROVIDER_URL, "ldap://host:port");
       env.put(Context.SECURITY_PRINCIPAL, "admin");
       env.put(Context.SECURITY_CREDENTIALS, "password");       DirContext ldapContext = new InitialDirContext(env);
       // modify user ldap record. Note: We are not making the necessary checks to
       // keep the sample code minimal.
       Attributes attributes = new BasicAttributes();
       attributes.put(new BasicAttribute("givenname", firstname));
       attributes.put(new BasicAttribute("sn", lastname));
       attributes.put(new BasicAttribute("mail", nameID));
       attributes.put(new BasicAttribute("uid", uid));
       ldapContext.modifyAttributes(localUserDN,
                          DirContext.REPLACE_ATTRIBUTE, attributes);
     }
     catch (NamingException ex) {
       throw new AuthenticationException(ex);
     }
     // return success, so that OAM can resume the flow
     return ExecutionStatus.SUCCESS;
   }
   public String getPluginName() {
     return "CustomAttributesUpdatePlugin";
   }
   public String getDescription() {
     return "Custom Attributes Update Plugin";
   }
   public Map<String, MonitoringData> getMonitoringData() {
     return null;
   }
   public boolean getMonitoringStatus() {
     return false;
   }
   public int getRevision() {
     return 10;
   }
   public void setMonitoringStatus(boolean arg0) {
   } }

Fichier d'inscription de plug-in

Le module d'extension d'authentification personnalisé doit être défini dans un fichier XML de module d'extension tel que :

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

Remarque importante : le fichier XML doit porter le même nom que la classe implémentant le module d'extension, dans ce cas CustomAttributesUpdatePlugin.xml

Pour plus d'informations, reportez-vous au guide du développeur OAM.

Fichier manifeste

Avant de packager le module d'extension d'authentification personnalisé dans un fichier JAR, vous devez définir un élément MANIFEST.MF tel que : Manifest-Version : 1.0 Bundle-ManifestVersion : 2 Bundle-Name : CustomAttributesUpdatePlugin Bundle-SymbolicName : CustomAttributesUpdatePlugin Bundle-Version : 10 Bundle-Activator : postsp.CustomAttributesUpdatePlugin Import-Package : org.osgi.framework ;version="1.3.0",oracle.security.am.plugin,oracle.security.am.plugin.authn,oracle.security.am.common.utilities.principal,javax.naming,javax.naming.directory,javax.security.auth Bundle-RequiredExecutionEnvironment : JavaSE-1.6

Pour plus d'informations, reportez-vous au guide du développeur OAM.

Remarque : le fichier manifeste doit inclure la propriété Import-Package qui répertorie tous les packages utilisés dans le module d'extension.

Création du module d'extension

Compilation

Les fichiers JAR suivants du déploiement OAM doivent être utilisés pour la compilation :

Ces fichiers se trouvent aux emplacements suivants :

Dans cet exemple, nous plaçons le fichier CustomAttributesUpdatePlugin.java dans un dossier src/postsp :

bash-4.1$ ls -l src/postsp/ total 4
-rw-r--r-- 1 root root 4377 Oct 1 09:54 CustomAttributesUpdatePlugin.java

Pour compiler, exécutez la commande suivante :

$JDK_HOME/bin/javac -cp $IAM_HOME/oam/server/lib/plugin /felix.jar:$IAM_HOME/oam/server/lib/plugin/oam-
plugin.jar:$IAM_HOME/oam/server/lib/plugin/utilities.jar src/postsp /\*.java

Packaging du module d'extension personnalisé

Nous avons créé MANIFEST.MF dans le répertoire en cours en fonction du contenu répertorié dans la section précédente et CustomAttributesUpdatePlugin.xml dans le répertoire src, qui contient la définition de module d'extension répertoriée dans la section précédente.

find
.
./MANIFEST.MF
./src
./src/userauthn
./src/userauthn/CustomAttributesUpdatePlugin.class
./src/userauthn/CustomAttributesUpdatePlugin.java
./src/CustomAttributesUpdatePlugin.xml

Pour créer le fichier JAR CustomAttributesUpdatePlugin.jar qui contient le module d'extension et les fichiers requis, exécutez la commande suivante :

jar cfvm CustomAttributesUpdatePlugin.jar MANIFEST.MF -C src/ . added manifest adding: CustomAttributesUpdatePlugin.xml(in = 238) (out= 158)(deflated 33%) adding: postsp/(in = 0) (out= 0)(stored 0%) adding: postsp/CustomAttributesUpdatePlugin.java(in = 4377) (out= 1206)(deflated 72%) adding: postsp/CustomAttributesUpdatePlugin.class(in = 3726) (out= 1667)(deflated 55%)

Cette opération crée CustomAttributesUpdatePlugin.jar. Pour visualiser le contenu du fichier :

unzip -l CustomAttributesUpdatePlugin.jar Archive: CustomAttributesUpdatePlugin.jar
Longueur Date Heure Nom
0 10-01-2014 10:04 MÉTA-INF/
(542) 10-01-2014 10:04 MÉTA-INF/MANIFEST.MF
(238) 10-01-2014 09:11 CustomAttributesUpdatePlugin.xml
0 10-01-2014 09:59 postsp/
(4377) 10-01-2014 09:54 postsp/CustomAttributesUpdatePlugin.java
(3726) 10-01-2014 09:54 postsp/CustomAttributesUpdatePlugin.class
(8883)   6  

Remarque importante : le fichier JAR doit porter le même nom que la classe implémentant le module d'extension, dans ce cas CustomAttributesUpdatePlugin.jar

Déploiement du module d'extension d'authentification personnalisée

Pour déployer le module d'extension d'authentification personnalisé dans OAM, procédez comme suit :

  1. Accédez à la console d'administration OAM : http(s)://oam-adminhost:oam-admin-port/oamconsole
  2. Accédez à Access Manager, Plug-ins
  3. Cliquez sur Importer le plug-in.
  4. Sélectionnez le fichier JAR de module d'extension (CustomAttributesUpdatePlugin.jar dans cet exemple).

Description de l'illustration Specifying_Plug-in_JAR_file.png

Le module d'extension sera à l'état téléchargé :

Description de l'illustration Plug-in_loaded_Screen.png

Vous devez distribuer le module d'extension aux serveurs OAM d'exécution et l'activer :

  1. Sélectionner le module d'extension
  2. Cliquez sur Distribuer la sélection L'onglet Statut d'activation du module d'extension affiche l'état du module d'extension

Description de l'illustration Plug-in_Screen_with_Status.png

Vous devez activer le plugin :

  1. Sélectionner le module d'extension
  2. Cliquez sur Activer la sélection L'onglet Statut d'activation du module d'extension affiche l'état du module d'extension

Description de l'illustration Plug-in_Screen_with_Status_Activated.png

Créer le module d'authentification

Créez un module d'authentification de fédération basé sur le module d'authentification FederationPlugin existant, qui diffère du module existant :

Pour créer un module d'authentification, procédez comme suit :

  1. Accédez à la console d'administration OAM : http(s)://oam-adminhost: oam-admin-port/oamconsole
  2. Accédez à Access Manager, Modules d'authentification.
  3. Cliquez sur Créer un module d'authentification.
  4. Sélectionnez Créer un module d'authentification personnalisé.
  5. Entrez un nom (CustomFedModule, par exemple)

Description de l'image Creating_Authentication_Module.png

Pour ajouter des étapes au nouveau module d'authentification, procédez comme suit :

  1. Cliquez sur l'onglet Etapes.
  2. Cliquez sur Ajouter pour ajouter l'étape FedAuthnRequestPlugin :
  3. Cliquez sur OK.
  4. Description de l'image Add_Authentication_Module.png

  5. Cliquez sur Ajouter pour ajouter l'étape AssertionProcessing :
  6. Cliquez sur OK.
  7. Description de l'image Add_Assertion_Processing_Screen.png

  8. Cliquez sur Ajouter pour ajouter l'étape AttributesUpdate :
  9. Cliquez sur OK.

Description de l'image Attributes_Update_Screen.png

L'onglet Etapes affiche :

Description de l'image Steps_Screen.png

Pour définir l'orchestration des étapes pour le nouveau module d'authentification, procédez comme suit :

  1. Cliquez sur l'onglet Orchestration des étapes Sélectionnez FedAuthnRequestPlugin comme étape initiale de FedAuthnRequestPlugin :
  2. Sélectionner une réussite en cas de succès
  3. Sélectionnez AssertionProcessing pour Sur échec Sélectionner échec pour Sur erreur
  4. Cliquez sur Appliquer

Description de l'image Define_Orchestration_Screen.png

Modèle d'authentification

Avant de pouvoir protéger les ressources avec une stratégie d'authentification qui utilise le nouveau module d'authentification, un nouveau modèle d'authentification doit être créé, référençant ce nouveau module personnalisé. Cette opération est obligatoire, car la stratégie d'authentification est liée à un modèle d'authentification et non à un module d'authentification. Pour créer un nouveau modèle d'authentification pour ce module personnalisé, procédez comme suit :

  1. Accédez à la console d'administration OAM : http(s)://oam-adminhost:oam-admin-port/oamconsole
  2. Accédez à Access Manager, Modèles d'authentification.
  3. Cliquez sur Create Authentication Scheme.
  4. Entrez un nom (par exemple, CustomFedScheme) et une description Définissez le niveau d'authentification sur une valeur acceptable (2 dans cet exemple).
  5. Sélectionnez FORM comme méthode de défi.
  6. Définissez l'URL de redirection de défi (dans cet exemple, nous la définissons sur /oam/server/).
  7. Sélectionnez le nouveau module d'authentification personnalisé (CustomFedModule dans l'exemple)
  8. Définissez l'URL de défi (/pages/servererror.jsp dans cet exemple).
  9. Définissez le type de contexte (customWar par exemple)
  10. Définir la valeur contextuelle (/oam ici, car nous n'utilisons aucune page)
  11. Entrez au moins les informations suivantes pour les paramètres de question de vérification :
  12. Cliquez sur Appliquer

Description de l'image Authentication_Schemes_Screen.png

Tester

Protéger une ressource avec une stratégie d'authentification à l'aide du modèle d'authentification nouvellement créé. Le module d'authentification personnalisé est appelé. Avant SSO de fédération, l'enregistrement utilisateur LDAP pour Alice dans OAM/SP est le suivant :

dn: cn=alice,ou=users,dc=us,dc=oracle,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
givenName: al
title: manager
uid: alice
cn: alice
sn: APPLETON
userPassword:: e1NTSEE1MTJ9TXp0R2d0Si9GT1NzYUxvRXJqZW0rM1Q2eU5QMW9ZZmZ2Y3FkVWpaS1o1OFNGMy95ZDBueUxUbnllRi83SFRtS2JmOTJ0anY4TFd6di9UanliOGw4WFNQV1BxSnF3N mail: alice@oracle.com

Après l'authentification, IdP envoie les informations suivantes pour l'application utilisateur dans l'assertion SAML 2.0 :

Après l'accès avec connexion unique (SSO) de fédération, l'utilisateur CustomAttributesUpdatePlugin doit mettre à jour l'enregistrement LDAP de l'entité de sorte que sn, gelenname, uid et mail soient définis sur les valeurs de l'assertion SAML. L'enregistrement utilisateur LDAP pour Alice après l'opération SSO de fédération dans OAM/SP est désormais :

dn: cn=alice,ou=users,dc=us,dc=oracle,dc=com
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: top
givenName: Alice
title: manager
uid: alice
cn: alice
sn: Appleton
userPassword:: e1NTSEE1MTJ9TXp0R2d0Si9GT1NzYUxvRXJqZW0rM1Q2eU5QMW9ZZmZ2Y3FkVWpaS1o1OFNGMy95ZDBueUxUbnllRi83SFRtS2JmOTJ0anY4TFd6di9UanliOGw4WFNQV1BxSnF3N
mail: alice@oracle.com

Ressources de formation supplémentaires

Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuite sur le canal Oracle Learning YouTube. En outre, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour consulter la documentation du produit, visitez le site Oracle Help Center.