Autenticación¶
IsardVDI soporta diferentes proveedores de autenticación. Puede haber múltiples proveedores en la misma instalación
OAuth2¶
Deberías configurar los tokens de autenticación de tu aplicación para habilitar este tipo de inicios de sesión.
- BACKEND_HOST: Configúralo a tu dominio
- BACKEND_AUTH_AUTOREGISTRATION: Activar auto registro
Google¶
- BACKEND_AUTH_GOOGLE_ID: Configura tu ID de google.
- BACKEND_AUTH_GOOGLE_SECRET: Configura tu secreto de google.
Github¶
- BACKEND_AUTH_GITHUB_ID: Configura tu ID de github.
- BACKEND_AUTH_GITHUB_SECRET: Configura tu secreto de github.
LDAP¶
La autenticación LDAP usa el mismo formulario que el inicio de sesión local.
Para configurar la autenticación LDAP, tenemos que configurar los siguientes parámetros: isardvdi.cfg.example
Revisaremos cada parámetro de configuración:
| Parámetro | Valor por defecto | Descripción |
|---|---|---|
AUTHENTICATION_AUTHENTICATION_LDAP_ENABLED |
false |
Si se configura a true, esto habilitará la autenticación LDAP |
AUTHENTICATION_AUTHENTICATION_LDAP_PROTOCOL |
ldap |
El protocolo LDAP. Otros valores posibles son ldaps |
AUTHENTICATION_AUTHENTICATION_LDAP_HOST |
El servidor LDAP | |
AUTHENTICATION_AUTHENTICATION_LDAP_PORT |
389 | El puerto LDAP donde el servidor está escuchando |
AUTHENTICATION_AUTHENTICATION_LDAP_BIND_DN |
El DN que Isard va a usar para consultar el LDAP | |
AUTHENTICATION_AUTHENTICATION_LDAP_PASSWORD |
La contraseña que Isard va a usar para consultar el LDAP | |
AUTHENTICATION_AUTHENTICATION_LDAP_BASE_SEARCH |
El DN que todos los usuarios comparten (ej. ou=people,dc=example,dc=com) |
|
AUTHENTICATION_AUTHENTICATION_LDAP_FILTER |
(&(objectClass=person)(uid=%s)) |
El filtro que Isard va a usar para encontrar cada usuario. El %s representa el nombre de usuario que se envía a través del formulario. Más información aquí |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_UID |
El campo de la entrada LDAP que contiene el UID del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_UID |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_USERNAME |
El campo de la entrada LDAP que contiene el nombre de usuario del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_USERNAME |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_NAME |
El campo de la entrada LDAP que contiene el nombre del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_NAME |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_EMAIL |
El campo de la entrada LDAP que contiene el email del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_EMAIL |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_PHOTO |
El campo de la entrada LDAP que contiene la foto del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_PHOTO |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
En cuanto a los parámetros de configuración campo / regex: estos son los campos que la búsqueda LDAP responde. Por ejemplo, en algunas instalaciones, el campo para el email se llama 'mail'. Entonces, se aplica un regex a este campo, en caso de que necesitáramos filtrar dentro de un campo LDAP. Por defecto recoge todo el campo. La coincidencia del regex intenta extraer el primer grupo, pero si no hay grupo extraerá toda la coincidencia
Con esto, la autenticación LDAP va a funcionar. Sin embargo, ¡hay una característica ✨ extra ✨! Con la autenticación LDAP podemos autoregistrar los usuarios en grupos, así que no hay necesidad de usar los códigos de registro.
Autoregistro¶
Si un grupo tiene un código de registro, y el autoregistro LDAP está habilitado, el autoregistro LDAP siempre va a tomar preferencia. Para configurarlo, tenemos que configurar los siguientes parámetros de configuración: isardvdi.cfg.example
Revisaremos cada parámetro:
| Parámetro | Valor por defecto | Descripción |
|---|---|---|
AUTHENTICATION_AUTHENTICATION_LDAP_AUTO_REGISTER |
false |
Si se configura a true, esto habilitará el autoregistro LDAP |
AUTHENTICATION_AUTHENTICATION_LDAP_GUESS_CATEGORY |
false |
Si se configura a true, Isard intentará adivinar la categoría basada en los resultados de la búsqueda, en lugar de confiar en la ID de categoría proporcionada por el formulario. Esto permite que múltiples categorías usen el mismo formulario y URL de inicio de sesión |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_CATEGORY |
El campo de la entrada LDAP que contiene la categoría del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_CATEGORY |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_GROUP |
El campo de la entrada LDAP que contiene el grupo del usuario | |
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_GROUP |
.* |
El filtro regex que se va a aplicar en el campo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_SEARCH |
El DN que todos los grupos comparten (ej. dc=example,dc=com) |
|
AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_FILTER |
(&(objectClass=posixGroup)(memberUid=%s)) |
El filtro que Isard va a usar para encontrar cada usuario. El %s representa el nombre de usuario que se envía a través del formulario. Más información aquí |
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_ADMIN_GROUPS |
Una lista separada por comas de los grupos que van a ser parte del rol admin |
|
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_MANAGER_GROUPS |
Una lista separada por comas de los grupos que van a ser parte del rol manager |
|
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_ADVANCED_GROUPS |
Una lista separada por comas de los grupos que van a ser parte del rol advanced |
|
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_USER_GROUPS |
Una lista separada por comas de los grupos que van a ser parte del rol user |
|
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_DEFAULT |
user |
El rol por defecto que se le asignará al usuario si no coincide con un mapeo de grupo - rol. Los valores posibles son admin, manager, advanced y user |
En cuanto a los parámetros de configuración campo / regex: estos son los campos que la búsqueda LDAP responde. Por ejemplo, en algunas instalaciones, el campo para el email se llama 'mail'. Entonces, se aplica un regex a este campo, en caso de que necesitáramos filtrar dentro de un campo LDAP. Por defecto recoge todo el campo. La coincidencia del regex intenta extraer el primer grupo, pero si no hay grupo extraerá toda la coincidencia
Ejemplos de configuraciones LDAP¶
LDAP con autoregistro
## LDAP
AUTHENTICATION_AUTHENTICATION_LDAP_ENABLED=true
AUTHENTICATION_AUTHENTICATION_LDAP_PROTOCOL=ldap
AUTHENTICATION_AUTHENTICATION_LDAP_HOST=ldap.example.com
#AUTHENTICATION_AUTHENTICATION_LDAP_PORT=389
### Credenciales usadas para consultar el LDAP
AUTHENTICATION_AUTHENTICATION_LDAP_BIND_DN="uid=isard,ou=users,dc=example,dc=com"
AUTHENTICATION_AUTHENTICATION_LDAP_PASSWORD=password
### Base Search es el DN que todos los usuarios comparten, ej. ou=people,dc=example,dc=com
AUTHENTICATION_AUTHENTICATION_LDAP_BASE_SEARCH=dc=example,dc=com
### Filter es el filtro actual usado para buscar usuarios. El '%s' representa el usuario que se envía a través del formulario
### Más información: https://confluence.atlassian.com/kb/how-to-write-ldap-search-filters-792496933.html
AUTHENTICATION_AUTHENTICATION_LDAP_FILTER="(&(objectClass=person)(uid=%s))"
### Estos son los campos que la búsqueda LDAP responde. Por ejemplo, en algunas instalaciones, el campo para el email se llama 'mail'
### Entonces, se aplica un regex a este campo, en caso de que necesitáramos filtrar dentro de un campo LDAP. Por defecto recoge todo el campo
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_UID=uid
#AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_UID=.*
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_USERNAME=uid
#AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_USERNAME=.*
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_NAME=sn
#AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_NAME=.*
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_EMAIL=mail
#AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_EMAIL=.*
#AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_PHOTO=
#AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_PHOTO=.*
### Auto Registrar los usuarios ldap existentes en IsardVDI
AUTHENTICATION_AUTHENTICATION_LDAP_AUTO_REGISTER=true
AUTHENTICATION_AUTHENTICATION_LDAP_GUESS_CATEGORY=true
### Estos son los campos que la búsqueda LDAP responde. Por ejemplo, en algunas instalaciones, el campo para el grupo se llama 'group'
### Entonces, se aplica un regex a este campo, en caso de que necesitáramos filtrar dentro de un campo LDAP. Por defecto recoge todo el campo
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_CATEGORY=homeDirectory
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_CATEGORY="/home/users.images/([^/]+)/[^/]+/[^/]+"
AUTHENTICATION_AUTHENTICATION_LDAP_FIELD_GROUP=homeDirectory
AUTHENTICATION_AUTHENTICATION_LDAP_REGEX_GROUP="/home/users.images/[^/]+/([^/]+)/[^/]+"
### La búsqueda base para listar todos los grupos de un usuario
AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_SEARCH=dc=example,dc=com
### Filter es el filtro actual usado para buscar todos los grupos de un usuario. El '%s' representa el usuario que se envía a través del formulario
### Más información: https://confluence.atlassian.com/kb/how-to-write-ldap-search-filters-792496933.html
AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_FILTER="(&(objectClass=posixGroup)(memberUid=%s))"
### El campo que contiene el grupo en la búsqueda AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_FILTER
AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_SEARCH_FIELD=cn
#AUTHENTICATION_AUTHENTICATION_LDAP_GROUPS_SEARCH_REGEX=.*
### Todos los usuarios que están en al menos uno de los grupos especificados aquí, serán creados en el rol admin (separados por comas)
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_ADMIN_GROUPS=isard-admins
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_MANAGER_GROUPS=isard-managers
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_ADVANCED_GROUPS=profes,ofi
#AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_USER_GROUPS=ldapusers
# Este es el rol por defecto que tendrán los usuarios si no coinciden en ninguno de los grupos anteriores.
# Los valores pueden ser 'admin', 'manager', 'advanced', 'user'
AUTHENTICATION_AUTHENTICATION_LDAP_ROLE_DEFAULT=user
SAML¶
IsardVDI soporta autenticación SAML 2.0 mediante integración con cualquier Proveedor de Identidad (IdP) SAML. La autenticación SAML permite que los usuarios inicien sesión utilizando el proveedor de identidad existente de su organización en lugar de gestionar credenciales separadas en IsardVDI.
Configuración Básica¶
Para configurar la autenticación SAML, debemos establecer los siguientes parámetros: isardvdi.cfg.example
Repasaremos cada parámetro de configuración:
| Parámetro | Valor por defecto | Descripción |
|---|---|---|
AUTHENTICATION_AUTHENTICATION_SAML_ENABLED |
false |
Si se establece en true, se habilitará la autenticación SAML |
AUTHENTICATION_AUTHENTICATION_SAML_METADATA_URL |
La URL para obtener los metadatos del IdP (ej. https://idp.example.com/metadata) |
|
AUTHENTICATION_AUTHENTICATION_SAML_METADATA_FILE |
/keys/idp-metadata.xml |
Opcional: Archivo local de metadatos del IdP. Si este archivo existe, se usará en lugar de obtenerlo desde la URL. Esto permite que el servicio arranque sin acceso de red al IdP |
AUTHENTICATION_AUTHENTICATION_SAML_ENTITY_ID |
Opcional: Entity ID personalizado para el Proveedor de Servicio. Si no se configura, por defecto usa la URL de metadatos (https://tu-dominio.com/authentication/saml/metadata). Configura esto si tu IdP requiere un Entity ID específico (ej., mi-app) |
|
AUTHENTICATION_AUTHENTICATION_SAML_SIGNATURE_METHOD |
Opcional: Método de firma para firmar peticiones SAML AuthnRequests. Si no se configura, las peticiones NO se firmarán. Configura esto si tu IdP requiere peticiones firmadas (AuthnRequestsSigned="true"). Valores válidos: http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 (recomendado), http://www.w3.org/2000/09/xmldsig#rsa-sha1, o http://www.w3.org/2001/04/xmldsig-more#rsa-sha512 |
|
AUTHENTICATION_AUTHENTICATION_SAML_KEY_FILE |
/keys/isardvdi.key |
La ruta al archivo de clave privada del Proveedor de Servicio |
AUTHENTICATION_AUTHENTICATION_SAML_CERT_FILE |
/keys/isardvdi.cert |
La ruta al archivo de certificado del Proveedor de Servicio |
AUTHENTICATION_AUTHENTICATION_SAML_MAX_ISSUE_DELAY |
90s |
El tiempo máximo entre la solicitud de inicio de sesión inicial y la respuesta |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_UID |
El nombre del atributo SAML que contiene el UID del usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_UID |
.* |
El filtro regex que se aplicará al campo UID. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_USERNAME |
El nombre del atributo SAML que contiene el nombre de usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_USERNAME |
.* |
El filtro regex que se aplicará al campo de nombre de usuario. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_NAME |
El nombre del atributo SAML que contiene el nombre para mostrar del usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_NAME |
.* |
El filtro regex que se aplicará al campo de nombre. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_EMAIL |
El nombre del atributo SAML que contiene el email del usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_EMAIL |
.* |
El filtro regex que se aplicará al campo de email. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_PHOTO |
El nombre del atributo SAML que contiene la URL de la foto del usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_PHOTO |
.* |
El filtro regex que se aplicará al campo de foto. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_SAVE_EMAIL |
true |
Si se establece en true, el email se guardará en la base de datos |
En cuanto a los parámetros de configuración field / regex: estos son los campos que contiene la aserción SAML. Por ejemplo, en algunas instalaciones, el campo para el email se llama 'mail'. Luego, se aplica un regex a este campo, en caso de que necesitemos extraer partes específicas de un valor de atributo SAML. Por defecto recoge todo el campo. La coincidencia de regex intenta extraer el primer grupo de captura, pero si no hay grupo extrae toda la coincidencia.
Configuración de Certificados¶
El Proveedor de Servicio (IsardVDI) requiere un certificado y clave privada para firmar las solicitudes SAML. Puedes:
-
Generar un certificado autofirmado:
-
Usar un certificado de la CA de tu organización
-
Dejar que IsardVDI genere un certificado autofirmado automáticamente (si los archivos no existen)
Archivo de Metadatos Local¶
IsardVDI soporta el uso de un archivo de metadatos local del IdP como respaldo. Esto es útil para: - Despliegues aislados (air-gapped) - Desarrollo/pruebas sin acceso a red - Arranque más rápido (sin latencia de red) - Resiliencia cuando el IdP no está temporalmente disponible
Para usar un archivo de metadatos local:
# Descargar metadatos del IdP a archivo local
curl -o /opt/isard/authentication/keys/idp-metadata.xml https://idp.example.com/metadata
Comportamiento: IsardVDI primero intentará cargar los metadatos desde el archivo local. Si el archivo no existe o falla al parsearse, automáticamente recurrirá a obtenerlos desde METADATA_URL.
Auto-registro¶
Si un grupo tiene un código de registro, y el auto-registro SAML está habilitado, el auto-registro SAML siempre tendrá preferencia. Para configurarlo, debemos establecer los siguientes parámetros de configuración:
| Parámetro | Valor por defecto | Descripción |
|---|---|---|
AUTHENTICATION_AUTHENTICATION_SAML_AUTO_REGISTER |
false |
Si se establece en true, se habilitará el auto-registro SAML |
AUTHENTICATION_AUTHENTICATION_SAML_AUTO_REGISTER_ROLES |
[] |
Solo los usuarios con estos valores de rol serán auto-registrados (separados por comas). Vacío significa que todos los usuarios pueden registrarse |
AUTHENTICATION_AUTHENTICATION_SAML_GUESS_CATEGORY |
false |
Si se establece en true, IsardVDI intentará adivinar la categoría basándose en atributos SAML, en lugar de confiar en el ID de categoría proporcionado por el formulario. Esto permite que múltiples categorías usen el mismo formulario y URL de inicio de sesión |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_CATEGORY |
El nombre del atributo SAML que contiene la categoría del usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_CATEGORY |
.* |
El filtro regex que se aplicará al campo de categoría. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_GROUP |
El nombre del atributo SAML que contiene el grupo del usuario | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_GROUP |
.* |
El filtro regex que se aplicará al campo de grupo. Por defecto obtiene todo el campo |
AUTHENTICATION_AUTHENTICATION_SAML_GROUP_DEFAULT |
default |
El grupo por defecto que se asignará al usuario si no se detecta ningún grupo |
AUTHENTICATION_AUTHENTICATION_SAML_GUESS_ROLE |
false |
Si se establece en true, IsardVDI intentará determinar el rol del usuario desde atributos SAML |
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_ROLE |
El nombre del atributo SAML que contiene información de rol | |
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_ROLE |
.* |
El filtro regex para extraer el valor de rol del atributo. Importante: Debe envolverse en comillas simples si usa caracteres especiales |
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_ADMIN_IDS |
[] |
Lista separada por comas de valores de rol que se mapearán al rol admin |
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_MANAGER_IDS |
[] |
Lista separada por comas de valores de rol que se mapearán al rol manager |
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_ADVANCED_IDS |
[] |
Lista separada por comas de valores de rol que se mapearán al rol advanced |
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_USER_IDS |
[] |
Lista separada por comas de valores de rol que se mapearán al rol user |
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_DEFAULT |
user |
El rol por defecto que se asignará al usuario si no coincide con ningún mapeo de rol. Los valores posibles son admin, manager, advanced y user |
Importante: El auto-registro de categorías compara el valor de categoría extraído con el campo uid de la categoría en la base de datos (no los campos id o name). Al crear una categoría en la aplicación web para usuarios SAML, debe establecer el campo UID con el valor que será extraído por su REGEX_CATEGORY. Por ejemplo, si su regex extrae "departamento-a", cree una categoría con el UID establecido en "departamento-a".
Auto-creación de Grupos: A diferencia de las categorías, los grupos se crean automáticamente cuando AUTO_REGISTER=true está habilitado. Cuando un usuario SAML inicia sesión, IsardVDI extrae valores de grupo usando REGEX_GROUP y crea automáticamente cualquier grupo faltante con nombres auto-generados (ej., "saml_provider-saml_grupo-estudiante"). Si no se extraen grupos de los atributos SAML, el usuario se asigna al grupo predeterminado especificado en GROUP_DEFAULT (predeterminado: "default"). El administrador no necesita crear manualmente grupos en la aplicación web - se crean automáticamente en el primer inicio de sesión.
Single Logout (SLO)¶
Se soporta SAML Single Logout. El endpoint SLO se configura automáticamente en:
Puedes configurar a dónde se redirigen los usuarios después del cierre de sesión:
| Parámetro | Valor por defecto | Descripción |
|---|---|---|
AUTHENTICATION_AUTHENTICATION_SAML_LOGOUT_REDIRECT_URL |
URL para redirigir a los usuarios después del cierre de sesión. Si está vacío, redirige a / |
Endpoints SAML¶
Cuando SAML está habilitado, IsardVDI expone los siguientes endpoints:
| Endpoint | Ruta | Propósito |
|---|---|---|
| ACS | https://tu-dominio.com/authentication/saml/acs |
Servicio Consumidor de Aserciones - recibe aserciones SAML del IdP |
| Metadata | https://tu-dominio.com/authentication/saml/metadata |
Metadatos del Proveedor de Servicio para configuración del IdP |
| SLO | https://tu-dominio.com/authentication/saml/slo |
Endpoint de Single Logout |
Proporciona las URLs ACS y Metadata al administrador de tu IdP para completar la configuración SAML.
Ejemplo de Configuración SAML¶
Autenticación SAML básica con mapeo de atributos de usuario:
## SAML
AUTHENTICATION_AUTHENTICATION_SAML_ENABLED=true
AUTHENTICATION_AUTHENTICATION_SAML_METADATA_URL=https://idp.example.com/auth/realms/example/protocol/saml/descriptor
# Opcional: Usar archivo de metadatos local para arranque sin conexión
# curl -o /opt/isard/authentication/keys/idp-metadata.xml https://idp.example.com/auth/realms/example/protocol/saml/descriptor
#AUTHENTICATION_AUTHENTICATION_SAML_METADATA_FILE=/keys/idp-metadata.xml
# Opcional: Entity ID personalizado (si el IdP requiere un valor específico)
#AUTHENTICATION_AUTHENTICATION_SAML_ENTITY_ID=mi-app
# Opcional: Habilitar firmado de peticiones (si el IdP requiere AuthnRequestsSigned="true")
#AUTHENTICATION_AUTHENTICATION_SAML_SIGNATURE_METHOD=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
# Archivos de certificado (se generarán automáticamente si no existen)
AUTHENTICATION_AUTHENTICATION_SAML_KEY_FILE=/keys/isardvdi.key
AUTHENTICATION_AUTHENTICATION_SAML_CERT_FILE=/keys/isardvdi.cert
# Mapeo de Atributos de Usuario
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_UID=uid
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_USERNAME=uid
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_NAME=displayName
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_EMAIL=mail
AUTHENTICATION_AUTHENTICATION_SAML_SAVE_EMAIL=true
SAML con auto-registro y mapeo de roles:
## SAML
AUTHENTICATION_AUTHENTICATION_SAML_ENABLED=true
AUTHENTICATION_AUTHENTICATION_SAML_METADATA_URL=https://idp.example.com/metadata
# Opcional: Entity ID personalizado y firmado de peticiones
#AUTHENTICATION_AUTHENTICATION_SAML_ENTITY_ID=mi-app
#AUTHENTICATION_AUTHENTICATION_SAML_SIGNATURE_METHOD=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
# Atributos de Usuario
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_UID=uid
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_USERNAME=uid
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_NAME=displayName
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_EMAIL=mail
# Auto-registro
AUTHENTICATION_AUTHENTICATION_SAML_AUTO_REGISTER=true
AUTHENTICATION_AUTHENTICATION_SAML_AUTO_REGISTER_ROLES=teacher,student
AUTHENTICATION_AUTHENTICATION_SAML_GROUP_DEFAULT=default-group
# Mapeo de roles desde atributos SAML
# Ejemplo: Extraer rol de atributo como "urn:example:role:teacher:department:it"
AUTHENTICATION_AUTHENTICATION_SAML_GUESS_ROLE=true
AUTHENTICATION_AUTHENTICATION_SAML_FIELD_ROLE=eduPersonAffiliation
AUTHENTICATION_AUTHENTICATION_SAML_REGEX_ROLE='.*:role:([^:]+):.*'
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_ADVANCED_IDS=teacher,staff
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_USER_IDS=student
AUTHENTICATION_AUTHENTICATION_SAML_ROLE_DEFAULT=user
Resolución de Problemas¶
El servicio no arranca - error "fetch metadata":
- Verifica que METADATA_URL sea accesible desde el servidor
- Verifica la conectividad de red al IdP
- Usa la opción METADATA_FILE para cargar metadatos desde un archivo local
- Revisa los logs: docker logs isard-authentication
"No se recibieron atributos":
- Confirma que el IdP está configurado para enviar atributos
- Verifica que los nombres de parámetros FIELD_* coincidan con los nombres reales de atributos SAML
- Habilita el registro de depuración para ver la aserción SAML en bruto
Errores de certificado: - Asegúrate de que existan los archivos de certificado y clave privada - Verifica los permisos de archivo (la clave debe ser 600, el certificado debe ser 644) - Verifica que el certificado no haya expirado - Verifica que la clave y el certificado coincidan:
openssl rsa -modulus -noout -in /opt/isard/authentication/keys/isardvdi.key | openssl md5
openssl x509 -modulus -noout -in /opt/isard/authentication/keys/isardvdi.cert | openssl md5
Los usuarios no se auto-registran:
- Verifica que AUTO_REGISTER=true esté establecido
- Verifica que el rol del usuario coincida con AUTO_REGISTER_ROLES (si está configurado)
- Revisa los logs del servicio de autenticación para errores de registro
El regex no extrae correctamente:
- Prueba los patrones regex en https://regex101.com/
- Recuerda envolver el regex en comillas simples si contiene caracteres especiales
- El regex intenta extraer el primer grupo de captura (), o toda la coincidencia si no existe grupo
Errores "Solicitud no válida" o "Entity ID inválido" desde el IdP: - Verifica que el IdP esté configurado con el Entity ID correcto - Comprueba que tus metadatos SP coincidan con lo que espera el IdP:
- Si el IdP requiere un Entity ID específico, configuraAUTHENTICATION_AUTHENTICATION_SAML_ENTITY_ID
- Asegúrate de que el IdP tenga las URLs ACS y SLO correctas configuradas
Errores "URI de redirección no válido":
- Verifica que el IdP tenga las URIs de Redirección Válidas correctas configuradas:
- https://tu-dominio.com/authentication/saml/acs
- https://tu-dominio.com/authentication/saml/slo
- https://tu-dominio.com/authentication/callback
- Comprueba que la configuración del cliente del IdP tenga estas URLs en la lista permitida
Se requieren peticiones firmadas pero no funcionan:
- Configura AUTHENTICATION_AUTHENTICATION_SAML_SIGNATURE_METHOD=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
- Asegúrate de que los archivos de certificado y clave estén correctamente configurados y coincidan
- Verifica que el IdP tenga el certificado correcto en su configuración
- Comprueba los logs en busca del mensaje "SAML request signing enabled"