Módulo Posterior a la Autenticación Personalizado en OAM y SP

En este artículo se muestra cómo implementar un plugin de autenticación personalizado que se llamará después de que se haya completado SSO de federación y que:

Para obtener más información sobre cómo diseñar un plugin de autenticación personalizado, consulte OAM Developer's Guide, capítulo 3, que describe cómo desarrollar dicho módulo: http://docs.oracle.com/cd/E40329_01/dev.1112/e27134/authnapi.htm. Centrémonos en cómo:

Módulo de Autenticación de Federación

Nota importante: Al utilizar la aplicación de SP de prueba de federación, el módulo de autenticación se omite y, como tal, los plugins definidos en dicho módulo no se ejecutarán.

Un módulo de autenticación de OAM es:

El módulo de autenticación de federación de OOTB, denominado FederationPlugin, está formado por dos plugins:

La orquestación la pueden ver:

  1. Vaya a la consola de administración de OAM: http(s)://oam-adminhost:oam-admin-port/oamconsole.
  2. Vaya a Access Manager, Authentication Modules.
  3. Abra FederationScheme.
  4. Haga clic en el separador Pasos para ver los plugins.
  5. Haga clic en el separador Orquestación de pasos para ver la orquestación entre los distintos plugins y el plugin que se utiliza para iniciar la operación.

Descripción de la ilustración Federation_Plugin_Screen.png

Plugin AssertionProcessing

El plugin AssertionProcessing es responsable de la validación y el consumo de una afirmación de SSO entrante, de la asignación de la afirmación a un registro de usuario de LDAP local y devuelve la identidad del usuario, así como el contenido de la afirmación a OAM. La instancia AuthenticationContext compartida entre los plugins de autenticación contiene objetos CredentialParam que permiten que los distintos plugins se comuniquen en tiempo de ejecución, así como el resultado de la operación de autenticación.

Datos de contexto de autenticación

Tras una autenticación correcta, un plugin de autenticación de OAM devuelve los siguientes datos en AuthenticationContext:

Las siguientes instancias CredentialParam incluidas en el objeto Credential de AuthenticationContext

Las siguientes instancias PluginResponse incluidas en AuthenticationContext:

Nombre del almacén de identidades en el que se encuentra el registro de usuario

Nivel de autenticación si se sustituyó durante el procesamiento del SP de federación (consulte este artículo para obtener más información: Artículo 27 Asignación del método de autenticación de Fed a los niveles de autenticación en el SP de OAM)

Datos de afirmación, cada elemento es una instancia PluginResponse autónoma:

OAM utiliza los datos incluidos en AuthenticationContext para el procesamiento posterior.

Los datos de afirmación están formados por los siguientes elementos:

Ejemplo

Tomemos el siguiente ejemplo para examinar los datos que devuelve el plugin AssertionProcessing al final del flujo:

El partner IdP de OAM/SP está enlazado a un perfil de atributo IdP con solo una entrada, que asigna el UID de nombre de atributo de SAML al ID de usuario de nombre de atributo de sesión de OAM. En el ejemplo, el usuario de prueba estará activo:

Un ejemplo de la afirmación de SAML 2.0 es:

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

Después de procesar correctamente la afirmación de SAML 2.0 y la asignación de la respuesta de SSO entrante a un registro de usuario local, el plugin AssertionProcessing devuelve a OAM AuthenticationContext con los siguientes datos: Asunto que contiene:

Las siguientes instancias CredentialParam incluidas en el objeto Credential de AuthenticationContext

Las siguientes instancias PluginResponse incluidas en AuthenticationContext:

Plugin de autenticación personalizada

Visión general

En este artículo, supongamos que el despliegue de OAM/SP debe soportar:

Uso de un módulo de aprovisionamiento de usuarios justo a tiempo que proporciona soporte para #1. Para poder cumplir los requisitos de #2, se necesita un plugin de autenticación personalizado que:

En este ejemplo, el entorno está formado por:

El plugin de autenticación personalizado está formado por lo siguiente:

Estos tres elementos se incluyen en un archivo JAR que, a continuación, se carga en el servidor de OAM mediante la consola de administración de OAM. Una vez cargado y activado, modifique el módulo de autenticación de federación.

Clase Java

La clase que implementa el plugin de autenticación personalizado debe cumplir lo siguiente:

El siguiente código es un ejemplo del plugin personalizado.

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

Archivo de registro de plugin

El plugin de autenticación personalizado se debe definir en un archivo XML de plugin como:

<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: el archivo XML debe tener el mismo nombre que la clase que implementa el plugin, en este caso CustomAttributesUpdatePlugin.xml

Consulte la guía para desarrolladores de OAM para obtener más información.

Archivo de manifiesto

Before packaging the custom Authentication plugin in a JAR file, a MANIFEST.MF must be defined such as: 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

Consulte la guía para desarrolladores de OAM para obtener más información.

Nota: El archivo de manifiesto debe incluir la propiedad Import-Package, que enumera todos los paquetes que se utilizan en el plugin

Creación del plugin

Compilación

Los siguientes archivos JAR del despliegue de OAM se deben utilizar para la compilación:

Estos archivos se encuentran en las siguientes ubicaciones:

En este ejemplo, colocamos el archivo CustomAttributesUpdatePlugin.java en una carpeta src/postsp:

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

Para compilar, ejecute el siguiente 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

Empaquetado del plugin personalizado

Creamos MANIFEST.MF en el directorio actual según el contenido mostrado en la sección anterior y CustomAttributesUpdatePlugin.xml en el directorio src, que contiene la definición de plugin mostrada en la sección anterior.

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

Para crear el archivo JAR CustomAttributesUpdatePlugin.jar que contiene el plugin y los archivos necesarios, ejecute el siguiente comando:

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

De esta forma se crea CustomAttributesUpdatePlugin.jar. Para ver el contenido del archivo:

unzip -l CustomAttributesUpdatePlugin.jar Archive: CustomAttributesUpdatePlugin.jar
Longitud Fecha Hora Nombre
0 10-01-2014 10:04 METADATOS/
542 10-01-2014 10:04 META-INF/MANIFEST.MF
238 10-01-2014 09:11 CustomAttributesUpdatePlugin.xml (Fin de creación)
0 10-01-2014 09:59 postp/
4377 10-01-2014 09:54 postsp/CustomAttributesUpdatePlugin.java
3726 10-01-2014 09:54 postsp/CustomAttributesUpdatePlugin.class
8883   6  

Nota importante: el archivo JAR debe tener el mismo nombre que la clase que implementa el plugin, en este caso CustomAttributesUpdatePlugin.jar

Despliegue del plugin de autenticación personalizado

Realice los siguientes pasos para desplegar el plugin de autenticación personalizado en OAM:

  1. Vaya a la consola de administración de OAM: http(s)://oam-adminhost:oam-admin-port/oamconsole
  2. Vaya a Access Manager, Plugins.
  3. Haga clic en Importar plugin
  4. Seleccione el archivo JAR del plugin (CustomAttributesUpdatePlugin.jar en este ejemplo)

Descripción de la ilustración Specifying_Plug-in_JAR_file.png

El plugin tendrá un estado cargado:

Descripción de la ilustración Plug-in_loaded_Screen.png

Debe distribuir el plugin a los servidores de OAM en tiempo de ejecución y activarlo:

  1. Seleccione el plugin
  2. Haga clic en Distribuir seleccionado El separador Estado de activación del plugin muestra el estado del plugin

Descripción de la ilustración Plug-in_Screen_with_Status.png

Debe activar el plugin:

  1. Seleccione el plugin
  2. Haga clic en Activar seleccionado El separador Estado de activación del plugin muestra el estado del plugin

Descripción de la ilustración Plug-in_Screen_with_Status_Activated.png

Creación del módulo de autenticación

Cree un nuevo módulo de autenticación de federación basado en el módulo de autenticación FederationPlugin existente, que difiera del existente:

Realice los siguientes pasos para crear un nuevo módulo de autenticación:

  1. Vaya a la consola de administración de OAM: http(s)://oam-adminhost: oam-admin-port/oamconsole
  2. Vaya a Access Manager, Authentication Modules.
  3. Haga clic en Crear módulo de autenticación.
  4. Seleccione Create Custom Authentication Module.
  5. Introduzca un nombre (CustomFedModule, por ejemplo)

Descripción de la ilustración Creating_Authentication_Module.png

Realice los siguientes pasos para agregar pasos al nuevo módulo de autenticación:

  1. Haga clic en el separador Pasos
  2. Haga clic en Agregar para agregar el paso FedAuthnRequestPlugin:
  3. Haga clic Aceptar
  4. Descripción de la ilustración Add_Authentication_Module.png

  5. Haga clic en Agregar para agregar el paso AssertionProcessing:
  6. Haga clic Aceptar
  7. Descripción de la ilustración Add_Assertion_Processing_Screen.png

  8. Haga clic en Agregar para agregar el paso AttributesUpdate:
  9. Haga clic Aceptar

Descripción de la ilustración Attributes_Update_Screen.png

El separador Pasos muestra:

Descripción de la ilustración Steps_Screen.png

Realice los siguientes pasos para definir la orquestación de pasos para el nuevo módulo de autenticación:

  1. Haga clic en el separador Orquestación de pasos Seleccione FedAuthnRequestPlugin como paso inicial para FedAuthnRequestPlugin:
  2. Selección de ejecución correcta
  3. Seleccione AssertionProcessing para Fallo de selección en caso de error
  4. Haga clic en Aplicar.

Descripción de la ilustración Define_Orchestration_Screen.png

Esquema de Autenticación

Antes de poder proteger recursos con una política de autenticación que utilice el nuevo módulo de autenticación, se debe crear un nuevo esquema de autenticación que haga referencia a ese nuevo módulo personalizado. Esto es necesario, ya que la política de autenticación está enlazada a un esquema de autenticación, no a un módulo de autenticación. Para crear un nuevo esquema de autenticación para ese módulo personalizado, realice los siguientes pasos:

  1. Vaya a la consola de administración de OAM: http(s)://oam-adminhost:oam-admin-port/oamconsole
  2. Vaya a Access Manager, Authentication Schemes.
  3. Haga clic en Create Authentication Scheme.
  4. Introduzca un nombre (por ejemplo, CustomFedScheme) y una descripción Defina el nivel de autenticación en un valor aceptable (2 en este ejemplo).
  5. Seleccione FORM como Método de comprobación
  6. Defina la URL de redirección de desafío (en este ejemplo, la definimos en /oam/server/)
  7. Seleccione el módulo de autenticación personalizado recién creado (CustomFedModule en el ejemplo).
  8. Defina la URL de desafío (/pages/servererror.jsp en este ejemplo).
  9. Defina el tipo de contexto (customWar, por ejemplo)
  10. Defina el valor de contexto (/oam aquí, ya que no utilizamos ninguna página)
  11. Introduzca al menos lo siguiente para los parámetros de comprobación:
  12. Haga clic en Aplicar.

Descripción de la ilustración Authentication_Schemes_Screen.png

Probar

Proteja un recurso con una política de autenticación mediante el esquema de autenticación recién creado. Esto llama al módulo de autenticación personalizado. Antes de la SSO de federación, el registro de usuario LDAP para alice en OAM/SP es:

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

Después de la autenticación, IdP envía la siguiente información para el usuario en la afirmación de SAML 2.0:

Después del inicio de sesión único de federación, CustomAttributesUpdatePlugin tiene que actualizar el registro LDAP de alice para que sn, attachname, uid y mail se definan en los valores de la afirmación de SAML. El registro de usuario de LDAP para alice después de la operación SSO de federación en OAM/SP ahora es:

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

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre el producto, visite Oracle Help Center.