Page tree
Skip to end of metadata
Go to start of metadata

Uso de filtros authproc

SimpleSAMLphp hace uso de una serie de filtros (Authentication Processing Filters) que permiten realizar todo tipo de modificaciones sobre atributos previamente extraídos de una fuente de datos. A continuación enumeramos un subconjunto de los distintos procesadores así como el uso principal que se hace de ellos:


Hay más filtros disponibles que pueden ser consultados en la página de SimpleSAMLphp. 

En las siguientes secciones incluimos varias recetas para el cálculo de atributos de la federación utilizando los filtros mencionados anteriormente. Los atributos que se van a explicar son los recomendados por SIR2. Pueden consultarse aquí.

Estos filtros están diseñados para ser capaces de liberar los atributos recomendados a partir de los siguientes campos disponibles en la fuente de datos configurada (Base de datos o LDAP):

  • uid
  • givenName
  • email
  • eduPersonAffiliation

Además, será necesario contar con una contraseña y salt, pero no influye para la liberación de los atributos, ya que estos no se envían.

Los nombre de estos atributos pueden modificarse, pueden ser los que cada institución considere apropiado, pero hay que tener en cuenta que los filtros explicados y el archivo de ejemplo final parten de esta estructura. Si se modifica la estructura será necesario modificar los filtros para adecuarlos a ella. Siguiendo las explicaciones de los filtros resultará muy fácil de modificar según las necesidades de cada institución.

Copia del atributo mail 

Suponiendo que en la fuente de datos almacenamos el correo electrónico en un campo cuyo nombre no es "mail", deberemos realizar un filtro por copia. En el siguiente ejemplo partimos de un campo "email" en nuestra fuente de datos. En el caso de que en nuestra fuente de datos ya tuviéramos este campo con el nombre "mail", no sería necesario añadir ningún filtro para liberar dicho atributo.

1 => array(
'class' => 'core:AttributeCopy',
'email' => 'mail',
),


Generación de eduPersonTargetedID

Este atributo debe identificar inequívocamente al usuario. Lo generaremos cifrando la concatenación del email con el string "SIR2" en md5.


2 => array(
'class' => 'core:PHP',
'code' => '
$attributes["LegacyTargetedId"] = array(md5($attributes["email"][0]."SIR2"));
',
),

48 => array(
'class' => 'core:AttributeCopy',
'LegacyTargetedId' => 'eduPersonTargetedID'
),


Copia de los valores cn (commonName) y displayName

Partiendo de un campo en la fuente de datos con el nombre "givenName", tendremos que copiar su valor a los atributos cn (commonName) y displayName. Estos atributos representarán el nombre del usuario.

45 => array(
'class' => 'core:AttributeCopy',
'givenName' => array('cn','displayName'),
) ,

Calculo de schacPersonalUniqueCode

Este campo recibe un valor compuesto por una parte fija a la que añadimos el email del usuario cifrado con md5.


27 => array(
'class' => 'core:PHP',
'code' => '
$attributes["schacPersonalUniqueCode"] = array("urn:mace:terena.org:schac:personalUniqueCode:es:rediris:sir:mbid:{md5}".md5($attributes["email"][0]));
',
) ,

Calculo de eduPersonEntitlement

Este atributo, en principio, tendrá un valor fijo. 

53 => array(
'class' => 'core:AttributeAdd',
'eduPersonEntitlement' => array('urn:mace:dir:entitlement:common-lib-terms'),
),

Cálculo de eduPersonAffiliation y eduPersonScopedAffiliation

Este atributo recibe valores de tipo staff@rediris.es y puede conseguirse con los siguientes filtros:


25 => array(
'class' => 'core:GenerateGroups', 'eduPersonAffiliation'
),

55 => array(
  'class' => 'core:ScopeAttribute',
  'scopeAttribute' => 'eduPersonPrincipalName',
  'sourceAttribute' => 'eduPersonAffiliation',
  'targetAttribute' => 'eduPersonScopedAffiliation',
),


Estos filtros funcionarán porquei en la fuente de datos disponemos de un campo "eduPersonAffiliation". Si el campo de nuestra fuente de datos se llamara, por ejemplo, "rol", deberíamos de realizar antes un filtro por copia, como los que hemos visto anteriormente para la generación de otros atributos, como el mail.

Inserción de schacHomeOrganization y de schacHomeOrganizationType


52 => array(
  'class' => 'core:AttributeAdd', 'urn:oid:2.5.4.10' => 'REDIRIS', //Nombre de la organización
  'urn:oid:1.3.6.1.4.1.25178.1.2.9' => array('rediris.es') , // schacHomeOrganization
  'urn:oid:1.3.6.1.4.1.25178.1.2.10' => array('urn:schac:homeOrganizationType:es:pri') ,
) ,

Cálculo de eduPersonPrincipalName

Este atributo recibe un valor de tipo uid@rediris.es (la parte de uid puede ser un identificador opaco o identificativo del usuario), que componemos en base al valor de uid (tal cual ha salido del directorio LDAP) y al valor de schacHomeOrganization previamente definido.


54 => array(
  'class' => 'core:ScopeAttribute',
  'scopeAttribute' => 'urn:oid:1.3.6.1.4.1.25178.1.2.9',
  'sourceAttribute' => 'uid',
  'targetAttribute' => 'eduPersonPrincipalName',
),


Configuración de exportación de atributos

Mediante el siguiente filtro exportaremos los atributos en formato oid.

100 => array('class' => 'core:AttributeMap', 'name2oid'),

En el caso de que estuviéramos haciendo uso de atributos pertenecientes a esquemas IRIS en LDAP, deberíamos añadir además un filtro para transformar dichos atributos en formato oid.

99 => array( 'class' => 'core:AttributeMap', 'sir2oid' ) ,

Ejemplo de un archivo saml20-idp-hosted.php funcional


<?php
$metadata['https://sso.example.es'] = array(
 'UIInfo' => array(

 // Nombre de la institución en diferentes idiomas

 'DisplayName' => array(
 'en' => 'Name',
 'es' => 'Name ',
 'gl' => 'Name ',
 'eu' => 'Name ',
 'ca' => 'Name ',
 ) ,

 // Descripción de la institución en diferentes idiomas

 'Description' => array(
 'en' => 'Description',
 'es' => 'Description',
 'gl' => 'Description',
 'eu' => 'Description',
 'ca' => 'Description',
 ) ,

 // Web de la institución en los diferentes idiomas disponibles

 'InformationURL' => array(
 'en' => 'https://www.example.es',
 'es' => 'https://www.example.es',
 'gl' => 'https://www.example.es',
 'eu' => 'https://www.example.es',
 'ca' => 'https://www.example.es',
 ) ,
 ) ,
 'host' => '__DEFAULT__',
 'privatekey' => 'sso.institution.es.key.pem',
 'certificate' => 'sso.institution.es.crt.pem',
 'auth' => 'ldap_datasource',
 'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
 'attributes' => array(
 'eduPersonTargetedID',
 'eduPersonAffiliation',
 'schacHomeOrganization',
 'eduPersonEntitlement',
 'schacPersonalUniqueCode',
 'uid',
 'mail',
 'displayName',
 'commonName',
 'cn',
 'eduPersonScopedAffiliation',
 'eduPersonPrincipalName',
 'schacHomeOrganizationType',
 ) ,
 'userid.attribute' => 'uid',

 // Filtros de procesado de los atributos

 'authproc' => array(
	   1 => array(
			'class' => 'core:AttributeCopy',
			'email' => 'mail',
	   ),
	   2 => array(
			'class' => 'core:PHP',
			'code' => '
				$attributes["LegacyTargetedId"] = array(md5($attributes["email"][0]."SIR2"));
			',
	   ),

       25 => array(
            'class' => 'core:GenerateGroups', 'eduPersonAffiliation'
       ),

       27 => array(
            'class' => 'core:PHP',
            'code' => '
                  $attributes["schacPersonalUniqueCode"] = array("urn:mace:terena.org:schac:personalUniqueCode:es:rediris:sir:mbid:{md5}".md5($attributes["email"][0]));
            ',
       ) ,
	   45 => array(
			'class' => 'core:AttributeCopy',
			'givenName' => array('cn','displayName'),
	   ) ,
	   48 => array(
			'class' => 'core:AttributeCopy',
	        'LegacyTargetedId' => 'eduPersonTargetedID'
	   ),
	   50 => 'core:AttributeLimit',
	   52 => array(
			'class' => 'core:AttributeAdd', 'urn:oid:2.5.4.10' => 'REDIRIS', //Nombre de la organización
			'urn:oid:1.3.6.1.4.1.25178.1.2.9' => array('rediris.es') , // schacHomeOrganization
			'urn:oid:1.3.6.1.4.1.25178.1.2.10' => array('urn:schac:homeOrganizationType:es:pri') ,
	   ) ,
       53 => array(
            'class' => 'core:AttributeAdd',
            'eduPersonEntitlement' => array('urn:mace:dir:entitlement:common-lib-terms'),
       ),

       54 => array(
            'class' => 'core:ScopeAttribute',
            'scopeAttribute' => 'urn:oid:1.3.6.1.4.1.25178.1.2.9',
            'sourceAttribute' => 'uid',
            'targetAttribute' => 'eduPersonPrincipalName',
       ),

       55 => array(
           'class' => 'core:ScopeAttribute',
           'scopeAttribute' => 'eduPersonPrincipalName',
           'sourceAttribute' => 'eduPersonAffiliation',
           'targetAttribute' => 'eduPersonScopedAffiliation',
       ),

		100 => array('class' => 'core:AttributeMap', 'name2oid'),
 ),

 // Al menos para efectos de depuración, es conveniente no cifrar la aserción, y así podremos verla
 // con una extensión de navegador como SAMLTracer.
 'assertion.encryption' => false
);
?>
  • No labels