Modulo post-autenticazione personalizzato in OAM e SP

Questo articolo mostra come implementare un plugin di autenticazione personalizzato che verrà richiamato dopo il completamento di SSO Federation e che:

Per ulteriori informazioni su come progettare un plugin di autenticazione personalizzato, fare riferimento al manuale OAM Developer's Guide, capitolo 3, che descrive come sviluppare un modulo di questo tipo: http://docs.oracle.com/cd/E40329_01/dev.1112/e27134/authnapi.htm. Concentriamoci su come:

Modulo di autenticazione federazione

Nota importante: quando si utilizza l'applicazione Federation Test SP, il modulo di autenticazione viene ignorato e, come tale, i plugin definiti in tale modulo non verranno eseguiti.

Un modulo di autenticazione OAM è:

Il modulo di autenticazione della federazione OOTB, denominato FederationPlugin, è costituito da due plugin:

L'orchestrazione può essere visualizzata da:

  1. Andare alla console di amministrazione OAM: http(s)://oam-adminhost:oam-admin-port/oamconsole.
  2. Passare a Access Manager, Moduli di autenticazione.
  3. Aprire FederationScheme.
  4. Fare clic sulla scheda Passi per visualizzare i plugin.
  5. Fare clic sulla scheda Orchestrazione passi per visualizzare l'orchestrazione tra i vari plugin e il plugin utilizzato per avviare l'operazione.

Descrizione dell'immagine Federation_Plugin_Screen.png

Plugin AssertionProcessing

Il plugin AssertionProcessing è responsabile della convalida e dell'utilizzo di un'asserzione SSO in entrata per il mapping dell'asserzione a un record utente LDAP locale e restituisce l'identità dell'utente nonché il contenuto dell'asserzione a OAM. L'istanza AuthenticationContext condivisa tra i plugin di autenticazione contiene oggetti CredentialParam che consentono la comunicazione tra i vari plugin in runtime e il risultato dell'operazione di autenticazione.

Dati contesto di autenticazione

Dopo l'autenticazione riuscita, un plugin di autenticazione OAM restituisce i dati seguenti in AuthenticationContext:

Le istanze CredentialParam seguenti contenute nell'oggetto Credenziale di AuthenticationContext

Le istanze PluginResponse seguenti contenute in AuthenticationContext:

Nome dell'area di memorizzazione delle identità in cui si trova il record utente

Livello di autenticazione se è stato sostituito durante l'elaborazione di Federation SP (vedere questo articolo per ulteriori informazioni: Art 27 Mapping del metodo Authn Fed ai livelli Authn in OAM SP)

Dati di asserzione, in cui ogni elemento è un'istanza PluginResponse standalone:

I dati contenuti in AuthenticationContext vengono utilizzati da OAM per ulteriori elaborazioni.

I dati di asserzione sono costituiti dai seguenti elementi:

Esempio

Prendiamo l'esempio seguente per esaminare i dati restituiti dal plugin AssertionProcessing alla fine del flusso:

Il partner IdP in OAM/SP è associato a un profilo attributo IdP con una sola voce, che mappa l'UID nome attributo SAML all'ID utente nome attributo sessione OAM Nell'esempio, l'utente di test sarà alice:

Un esempio dell'asserzione 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>

Dopo l'elaborazione riuscita dell'asserzione SAML 2.0 e il mapping della risposta SSO in entrata a un record utente locale, il plugin AssertionProcessing restituisce a OAM AuthenticationContext con i dati seguenti: Oggetto contenente:

Le istanze CredentialParam seguenti contenute nell'oggetto Credenziale di AuthenticationContext

Le istanze PluginResponse seguenti contenute in AuthenticationContext:

Plug-in di autenticazione personalizzato

Panoramica

In questo articolo, supponiamo che la distribuzione di OAM/SP debba supportare:

Utilizzo di un modulo di provisioning utenti just-in-time che fornisce supporto per #1. Per poter soddisfare i requisiti per #2, è necessario un plugin di autenticazione personalizzato che:

In questo esempio l'ambiente è costituito da:

Il plugin di autenticazione personalizzato è composto da:

Questi tre elementi vengono inseriti in un file JAR che viene quindi caricato nel server OAM tramite la console di amministrazione OAM. Dopo il caricamento e l'attivazione, modificare il modulo di autenticazione Federation.

Classe Java

La classe che implementa il plugin di autenticazione personalizzato deve rispettare quanto riportato di seguito.

Il codice seguente è un esempio del plugin personalizzato.

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) {
   } }

File di registrazione plugin

Il plugin di autenticazione personalizzato deve essere definito in un file XML di plugin, ad esempio:

<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>

Nota importante: il file XML deve avere lo stesso nome della classe che implementa il plugin, in questo caso CustomAttributesUpdatePlugin.xml

Per ulteriori informazioni, vedere OAM Developer's Guide.

File manifest

Prima di creare il package del plugin di autenticazione personalizzato in un file JAR, è necessario definire MANIFEST.MF come: Versione-manifest: 1.0 Bundle-ManifestVersion: 2 Nome-bundle: CustomAttributesUpdatePlugin Bundle-SymbolicName: CustomAttributesUpdatePlugin Versione-bundle: 10 Bundle-Activator: postsp.CustomAttributesUpdatePlugin Package-importazione: org.osgi.framework;versione="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

Per ulteriori informazioni, vedere OAM Developer's Guide.

Nota: il file manifesto deve includere la proprietà Import-Package che elenca tutti i package utilizzati nel plugin

Creazione del plugin

Compilazione

Per la compilazione è necessario utilizzare i seguenti file JAR della distribuzione OAM:

Questi file sono disponibili nelle seguenti posizioni:

In questo esempio, il file CustomAttributesUpdatePlugin.java viene inserito in una cartella src/postsp:

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

Per compilare, eseguire il seguente comando:

$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

Creazione package del plugin personalizzato

Abbiamo creato MANIFEST.MF nella directory corrente in base al contenuto elencato nella sezione precedente e CustomAttributesUpdatePlugin.xml nella directory src, che contiene la definizione di plugin elencata nella sezione precedente.

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

Per creare il file JAR CustomAttributesUpdatePlugin.jar contenente il plugin e i file richiesti, eseguire il comando seguente:

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%)

Viene creato il file CustomAttributesUpdatePlugin.jar. Per visualizzare il contenuto del file:

unzip -l CustomAttributesUpdatePlugin.jar Archive: CustomAttributesUpdatePlugin.jar
Lunghezza Data Tempo Nome
0 10-01-2014 10:04 METADATI/
542 10-01-2014 10:04 META-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  

Nota importante: il file JAR deve avere lo stesso nome della classe che implementa il plugin, in questo caso CustomAttributesUpdatePlugin.jar

Distribuzione del plugin di autenticazione personalizzato

Per distribuire il plugin di autenticazione personalizzato in OAM, effettuare le operazioni riportate di seguito.

  1. Andare alla console di amministrazione OAM: http(s)://oam-adminhost:oam-admin-port/oamconsole
  2. Passare a Access Manager, Plugin
  3. Fare clic su Importa plugin.
  4. Selezionare il file JAR del plugin (CustomAttributesUpdatePlugin.jar in questo esempio)

Descrizione dell'illustrazione Specifying_Plug-in_JAR_file.png

Il plugin sarà in stato caricato:

Descrizione dell'immagine Plug-in_loaded_Screen.png

È necessario distribuire il plugin ai server OAM runtime e attivarlo:

  1. Selezionare il plugin
  2. Fare clic su Distribuisci selezione La scheda Stato attivazione del plugin mostra lo stato del plugin

Descrizione dell'immagine Plug-in_Screen_with_Status.png

È necessario attivare il plugin:

  1. Selezionare il plugin
  2. Fare clic su Attiva selezionato La scheda Stato attivazione del plugin mostra lo stato del plugin

Descrizione dell'immagine Plug-in_Screen_with_Status_Activated.png

Creazione del modulo di autenticazione

Creare un nuovo modulo di autenticazione federativa, basato sul modulo di autenticazione FederationPlugin esistente, diverso da quello esistente:

Per creare un nuovo modulo di autenticazione, effettuare le operazioni riportate di seguito.

  1. Andare alla console di amministrazione OAM: http(s)://oam-adminhost: oam-admin-port/oamconsole
  2. Passare a Access Manager, Moduli di autenticazione
  3. Fare clic su Crea modulo di autenticazione
  4. Selezionare Crea modulo di autenticazione personalizzato
  5. Immettere un nome (ad esempio, CustomFedModule)

Descrizione dell'immagine Creating_Authentication_Module.png

Per aggiungere passi al nuovo modulo di autenticazione, effettuare le operazioni riportate di seguito.

  1. Fare clic sulla scheda Passi
  2. Fare clic su Aggiungi per aggiungere il passo FedAuthnRequestPlugin:
  3. Fare clic su OK
  4. Descrizione dell'immagine Add_Authentication_Module.png

  5. Fare clic su Aggiungi per aggiungere il passo AssertionProcessing:
  6. Fare clic su OK
  7. Descrizione dell'immagine Add_Assertion_Processing_Screen.png

  8. Fare clic su Aggiungi per aggiungere il passo AttributesUpdate:
  9. Fare clic su OK

Descrizione dell'immagine Attributes_Update_Screen.png

La scheda Passi mostra:

Descrizione dell'immagine Steps_Screen.png

Per definire l'orchestrazione dei passi per il nuovo modulo di autenticazione, effettuare le operazioni riportate di seguito.

  1. Fare clic sulla scheda Orchestrazione passi Selezionare FedAuthnRequestPlugin come passo iniziale per FedAuthnRequestPlugin:
  2. Seleziona operazione riuscita
  3. Selezionare AssertionProcessing per Errore nella selezione dell'errore per In caso di errore
  4. Fare clic su Apply.

Descrizione dell'immagine Define_Orchestration_Screen.png

Schema di autenticazione

Prima di poter proteggere le risorse con un criterio di autenticazione che utilizza il nuovo modulo di autenticazione, è necessario creare un nuovo schema di autenticazione che faccia riferimento al nuovo modulo personalizzato. È necessario poiché il criterio di autenticazione è associato a uno schema di autenticazione e non a un modulo di autenticazione. Per creare un nuovo schema di autenticazione per il modulo personalizzato, effettuare le operazioni riportate di seguito.

  1. Andare alla console di amministrazione OAM: http(s)://oam-adminhost:oam-admin-port/oamconsole
  2. Passare a Access Manager, Schemi di autenticazione
  3. Fare clic su Crea schema di autenticazione
  4. Immettere un nome (ad esempio CustomFedScheme) e una descrizione Impostare il livello di autenticazione su un valore accettabile (2 in questo esempio)
  5. Selezionare FORM come Metodo di verifica
  6. Impostare l'URL di reindirizzamento verifica (in questo esempio viene impostato su /oam/server/).
  7. Selezionare il modulo di autenticazione personalizzato appena creato (CustomFedModule nell'esempio)
  8. Impostare l'URL di verifica (/pages/servererror.jsp in questo esempio)
  9. Impostare il Tipo di contesto (ad esempio customWar)
  10. Impostare il valore di contesto (/oam qui, poiché non viene utilizzata alcuna pagina)
  11. Immettere almeno quanto segue per i parametri della richiesta di verifica:
  12. Fare clic su Apply.

Descrizione dell'immagine Authentication_Schemes_Screen.png

Test

Proteggere una risorsa con un criterio di autenticazione utilizzando lo schema di autenticazione appena creato. Viene richiamato il modulo di autenticazione personalizzato. Prima dell'autenticazione SSO Federation, il record utente LDAP per l'alice in OAM/SP è il seguente:

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

Dopo l'autenticazione, IdP invia le seguenti informazioni per l'alice utente nell'asserzione SAML 2.0:

Dopo SSO Federation, CustomAttributesUpdatePlugin deve aggiornare il record LDAP dell'alice in modo che sn, givename, uid e posta siano impostati sui valori dell'asserzione SAML. Il record utente LDAP per gli alici dopo l'operazione SSO Federation in OAM/SP è ora:

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

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o visita altri contenuti di formazione gratuiti sul canale Oracle Learning YouTube. Inoltre, visitare education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione sul prodotto, visitare Oracle Help Center.