Descripción general
Fess soporta autenticación Single Sign-On (SSO) utilizando Microsoft Entra ID (anteriormente Azure AD). Al utilizar la autenticación de Entra ID, puede integrar la información de usuario y la información de grupo de su entorno Microsoft 365 con la búsqueda basada en roles de Fess.
Cómo funciona la autenticación de Entra ID
En la autenticación de Entra ID, Fess opera como un cliente OAuth 2.0/OpenID Connect y colabora con Microsoft Entra ID para la autenticación.
El usuario accede al endpoint SSO de Fess (
/sso/)Fess redirige al endpoint de autorización de Entra ID
El usuario se autentica con Entra ID (inicio de sesión de Microsoft)
Entra ID redirige el código de autorización a Fess
Fess utiliza el código de autorización para obtener un token de acceso
El usuario inicia sesión
En segundo plano, Fess utiliza la API de Microsoft Graph para recuperar la información de grupo y rol del usuario, y la aplica a la búsqueda basada en roles en cuanto finaliza la resolución
Nota
A partir de Fess 15.8, la respuesta de autorización del paso 4 se devuelve como una solicitud GET, ya que Fess solicita response_mode=query al endpoint de autorización. Hasta la versión 15.7 se devolvía mediante un POST entre sitios, y el valor por defecto incluido tomcat.sameSiteCookies = lax no envía la cookie de sesión en ese caso, por lo que era necesario tomcat.sameSiteCookies = none como solución alternativa. Si configuró none únicamente por ese motivo, puede volver al valor por defecto.
Para la integración con la búsqueda basada en roles, consulte Configuración de Búsqueda Basada en Roles.
Prerrequisitos
Antes de configurar la autenticación de Entra ID, verifique los siguientes prerrequisitos:
Fess 15.8 o superior está instalado
Un tenant de Microsoft Entra ID (Azure AD) está disponible
Fess es accesible a través de HTTPS (requerido para entornos de producción)
Tiene permiso para registrar aplicaciones en Entra ID
Configuración básica
Habilitar SSO
Para habilitar la autenticación de Entra ID, agregue la siguiente configuración en app/WEB-INF/conf/system.properties:
Configuración requerida
Configure la información obtenida de Entra ID.
| Propiedad | Descripción | Por defecto |
|---|---|---|
entraid.tenant | ID del tenant (ej: xxx.onmicrosoft.com) | (Requerido) |
entraid.client.id | ID de aplicación (Cliente) | (Requerido) |
entraid.client.secret | Valor del secreto del cliente | (Requerido) |
entraid.reply.url | URI de redirección (URL de callback) | Usa la URL de la solicitud |
Nota
En lugar del prefijo entraid.*, también puede usar el prefijo legacy aad.* para compatibilidad con versiones anteriores.
Configuración opcional
Las siguientes configuraciones pueden agregarse según sea necesario.
| Propiedad | Descripción | Por defecto |
|---|---|---|
entraid.authority | URL del servidor de autenticación | https://login.microsoftonline.com/ |
entraid.state.ttl | Tiempo de vida del state (segundos) | 3600 |
entraid.response.mode | Forma en que se devuelve la respuesta de autorización. Puede ser query o form_post. | query |
entraid.default.groups | Grupos por defecto (separados por comas). Se aplican a todos los usuarios de Entra ID. | (Ninguno) |
entraid.default.roles | Roles por defecto (separados por comas). Se aplican a todos los usuarios de Entra ID. | (Ninguno) |
entraid.permission.fields | Campos de grupo/rol (separados por comas) que se utilizan adicionalmente como valores de permiso. El ID de grupo/rol (GUID) siempre se usa como permiso, y los valores de los campos especificados aquí (ej: mail) se agregan. Solo pueden utilizarse campos cuyo valor sea una cadena de texto. Microsoft Graph devuelve un campo como securityEnabled en forma de booleano y groupTypes en forma de lista, y ninguno de los dos puede convertirse en un valor de permiso, por lo que un campo así se ignora y se escribe en el registro una advertencia que indica su nombre. | mail |
entraid.use.ds | Integración con el servicio de dominio. Cuando es true, para los valores de permiso en formato name@domain, la parte local (name) con la parte del dominio eliminada también se agrega como permiso. Esto se aplica no solo a los grupos y roles, sino también al propio usuario que ha iniciado sesión: la parte local de su nombre principal de usuario (UPN) se agrega como permiso a nivel de usuario. Por lo tanto, establecerlo en false elimina también ese permiso a nivel de usuario, no solo los de los grupos. | true |
Nota
El ID de grupo/rol (GUID) siempre se usa como permiso, pero solo los grupos habilitados para correo tienen un valor mail. Los grupos de Microsoft 365 están habilitados para correo, por lo que su nombre también se registra como permiso. Los grupos de seguridad no están habilitados para correo, por lo que con el valor predeterminado solo su GUID se convierte en un permiso. Si los derechos de acceso del sistema de archivos indican un grupo de seguridad, los permisos no coinciden y esos documentos no aparecen en los resultados de búsqueda.
En ese caso, agregue displayName, que todos los grupos tienen:
displayName no está calificado por dominio ni es único, por lo que no forma parte del valor predeterminado. Por ejemplo, si Entra ID tiene un grupo llamado Administrators, también coincidirá con documentos cuyos derechos de acceso indiquen el grupo integrado de Windows Administrators. Antes de agregarlo, compruebe que los nombres no entren en conflicto con los que ya se usan en sus derechos de acceso.
Nota
Con el valor por defecto query, el código de autorización se incluye en la cadena de consulta de la URL de callback. form_post mantiene el código fuera de la URL y, por lo tanto, fuera del historial del navegador y de los registros de acceso de cualquier proxy frontal o WAF, pero convierte el callback en un POST entre sitios y requiere tomcat.sameSiteCookies = none. Sin esa configuración, la cookie de sesión no se devuelve y el inicio de sesión falla. Además, los navegadores solo aceptan none en una cookie que también tenga el atributo Secure, por lo que form_post exige servir Fess mediante HTTPS: sobre HTTP simple el navegador ni siquiera almacena la cookie de sesión y el inicio de sesión sigue fallando. Por ello, la mayoría de las instalaciones deberían mantener el valor por defecto. Cualquier otro valor se ignora con una advertencia y se utiliza query.
Advertencia
entraid.default.groups y entraid.default.roles son valores globales únicos, sin ámbito por usuario. Fess los aplica a todos los usuarios de Entra ID al iniciar sesión y vuelve a aplicarlos en cada resolución posterior, por lo que Microsoft Graph nunca los retira. En particular, no ponga nunca el rol de administrador de Fess — admin con el valor authentication.admin.roles que se incluye — en entraid.default.roles: eso concede a todos los usuarios del inquilino acceso permanente a las pantallas de administración.
Configuración del lado de Entra ID
Registro de aplicación en Azure Portal
Inicie sesión en Azure Portal
Seleccione Microsoft Entra ID
Vaya a Administrar → Registros de aplicaciones → Nuevo registro
Registre la aplicación:
Configuración Valor Nombre Cualquier nombre (ej: Fess SSO) Tipos de cuenta compatibles «Solo cuentas en este directorio organizativo» Plataforma Web URI de redirección https://<host de Fess>/sso/Haga clic en Registrar
Crear un secreto de cliente
En la página de detalles de la aplicación, haga clic en Certificados y secretos
Haga clic en Nuevo secreto de cliente
Establezca una descripción y una fecha de expiración, luego haga clic en Agregar
Copie y guarde el Valor generado (este valor no se mostrará nuevamente)
Advertencia
El valor del secreto del cliente solo se muestra inmediatamente después de la creación. Asegúrese de registrarlo antes de salir de la página.
Configurar permisos de API
Haga clic en Permisos de API en el menú izquierdo
Haga clic en Agregar un permiso
Seleccione Microsoft Graph
Seleccione Permisos delegados
Agregue el siguiente permiso:
User.Read- Requerido para recuperar las pertenencias a grupos del usuario que ha iniciado sesión (/me/memberOf). Se concede por defecto al crear el registro de la aplicaciónGroupMember.Read.All- Requerido para leer atributos del grupo, como su nombre, y para resolver los grupos anidados
Haga clic en Agregar permisos
Haga clic en Conceder consentimiento de administrador para <nombre del tenant>
Nota
El consentimiento del administrador requiere privilegios de administrador del tenant.
Nota
En lugar de GroupMember.Read.All también se pueden conceder Group.Read.All o Directory.Read.All: la lectura de los atributos del grupo y la resolución de los grupos anidados siguen funcionando. Sin embargo, /me/memberOf no está autorizado por Group.Read.All, por lo que User.Read es necesario en cualquier caso.
Nota
Los permisos anteriores no cubren el displayName de un rol de directorio: Microsoft Graph lo devuelve como null. Por lo tanto, indicar displayName en entraid.permission.fields no aporta nada para un rol de directorio y solo el ID (GUID) del rol se convierte en un permiso. Para usar los nombres de rol como valores de permiso, conceda además RoleManagement.Read.Directory (o Directory.Read.All).
Nota
Fess solicita el ámbito https://graph.microsoft.com/.default al adquirir un token. Desde la versión 15.8, también se envía openid profile offline_access https://graph.microsoft.com/.default al endpoint de autorización, de modo que el consentimiento se solicita para el mismo conjunto. Esto significa que se utilizan todos los permisos de acceso configurados y para los que se ha dado consentimiento en el registro de la aplicación. Por lo tanto, para recuperar información de grupos, debe agregar los permisos indicados anteriormente al registro de la aplicación y otorgar el consentimiento del administrador.
Información a obtener
La siguiente información se utiliza para la configuración de Fess:
ID de aplicación (Cliente): En la página Información general, como «ID de aplicación (cliente)»
ID del tenant: En la página Información general, como «ID de directorio (tenant)» o en formato
xxx.onmicrosoft.comValor del secreto del cliente: El valor creado en Certificados y secretos
Mapeo de grupos y roles
Con la autenticación de Entra ID, Fess recupera automáticamente los grupos y roles a los que pertenece un usuario utilizando la API de Microsoft Graph. Los IDs de grupo y nombres de grupo recuperados pueden usarse para la búsqueda basada en roles de Fess.
Grupos anidados
Fess recupera no solo los grupos a los que los usuarios pertenecen directamente, sino también los grupos padre a los que estos pertenecen (grupos anidados). Tanto la búsqueda de la pertenencia directa como la búsqueda de grupos padre se ejecutan en la misma tarea en segundo plano después del inicio de sesión, de modo que el inicio de sesión nunca se ve retrasado por Microsoft Graph. La búsqueda de grupos padre utiliza la operación getMemberGroups de Microsoft Graph, que resuelve de forma transitiva: una sola llamada por cada grupo asignado directamente devuelve todos los grupos que están por encima de él, sea cual sea la profundidad del anidamiento. Los resultados obtenidos se almacenan en caché durante un período determinado. Cuando esa tarea en segundo plano finaliza, los permisos del usuario se recalculan.
Configuración de grupos por defecto
Para asignar grupos comunes a todos los usuarios de Entra ID:
Ejemplos de configuración
Configuración mínima (para pruebas)
El siguiente es un ejemplo de configuración mínima para verificación en un entorno de pruebas.
Configuración recomendada (para producción)
El siguiente es un ejemplo de configuración recomendada para entornos de producción.
Configuración legacy (compatibilidad con versiones anteriores)
Para compatibilidad con versiones anteriores, también se puede usar el prefijo aad.*. Cuando cada propiedad entraid.* no está configurada, se utiliza el valor de la propiedad aad.* correspondiente. Además, sso.type=aad se trata de la misma forma que sso.type=entraid.
Solución de problemas
Problemas comunes y soluciones
No se puede regresar a Fess después de la autenticación
Verifique que la URI de redirección esté configurada correctamente en el registro de aplicaciones del portal Azure
Asegúrese de que el valor de
entraid.reply.urlcoincida exactamente con la configuración del portal AzureVerifique que el protocolo (HTTP/HTTPS) coincida
Verifique que la URI de redirección termine con
/Si
entraid.response.modeestá establecido enform_post, verifique tanto quetomcat.sameSiteCookies = noneesté configurado como que Fess se sirva mediante HTTPS. Con el valor por defectolax, el navegador no envía la cookie de sesión en el POST entre sitios del callback; connonesobre HTTP simple, el navegador no almacena esa cookie en absoluto, porquenoneexige el atributoSecure. En ambos casos el inicio de sesión falla una sola vez: el navegador vuelve a la pantalla de inicio de sesión mostrando «Error en el proceso de inicio de sesión SSO.» y en el registro se escribe una advertencia con el textoFailed to process SSO login: could not validate state
Ocurren errores de autenticación
Verifique que el ID del tenant, ID de cliente y secreto del cliente estén configurados correctamente
Verifique que el secreto del cliente no haya expirado
Verifique que se haya otorgado el consentimiento del administrador para los permisos de API
No se puede recuperar la información de grupo
Verifique que se hayan otorgado los permisos
User.ReadyGroupMember.Read.All(GroupMember.Read.Allpuede sustituirse porGroup.Read.AlloDirectory.Read.All, pero/me/memberOfsigue requiriendoUser.Read)Verifique que se haya otorgado el consentimiento del administrador
Verifique que el usuario pertenezca a grupos en Entra ID
Si no se pueden resolver los grupos padre anidados, se registra la advertencia
Not allowed to read the parent groups of .... En ese caso, otorgueGroupMember.Read.AllFess resuelve la pertenencia a grupos y roles del usuario en segundo plano una vez completado el inicio de sesión, de modo que este nunca espera a Microsoft Graph. Hasta que la resolución termina, el usuario solo tiene su propio permiso a nivel de usuario y lo que aporten
entraid.default.groupsyentraid.default.roles. Si no se ha configurado ninguno de los dos —el valor por defecto que se incluye—, una búsqueda hecha en esa ventana no devuelve ningún documento:role.search.default.permissionsestá vacío de fábrica, y una configuración de rastreo creada con el valorrole.search.default.display.permissionsque se incluye concede{role}guest, rol que un usuario con la sesión iniciada no tiene. La ventana dura hasta aproximadamente un segundo de retardo de planificación más las propias llamadas a Microsoft Graph — una para las pertenencias directas y luego una más por cada uno de esos grupos para recorrer los grupos anidados, emitidas una tras otra con la caché fría —, por lo que crece con el número de grupos a los que pertenece el usuario. Mientras tanto, la pantalla de búsqueda indica al usuario que sus permisos de grupo y rol todavía se están cargando y le pide que repita la búsqueda en unos instantesSi la resolución no se completa del todo, la pantalla de búsqueda indica al usuario que sus permisos de grupo y rol no se pudieron cargar por completo, le pide que cierre la sesión y vuelva a iniciarla, y que contacte con el administrador si el problema persiste. Lo de «por completo» es deliberado: la resolución solo se considera correcta si han tenido éxito tanto la consulta de pertenencias directas como el recorrido de los grupos anidados, así que un usuario que tiene sus grupos directos pero no sus grupos padre también recibe ese mensaje. Hay un caso exento, y es precisamente el que describe el punto anterior: cuando Microsoft Graph rechaza la consulta de grupos anidados con
Authorization_RequestDeniedporque nunca se otorgóGroupMember.Read.All, Fess lo interpreta como una respuesta que significa que el grupo no tiene grupos padre, y no como un fallo. La resolución se considera entonces correcta y no se muestra ningún mensaje, aunque falten los permisos de los grupos padre. La única señal es la advertenciaNot allowed to read the parent groups of ...en el registro, así que conviene buscarla siempre que se utilicen grupos anidados. La causa habitual del caso parcial es la limitación de peticiones: un solo HTTP 429 o 503 de Microsoft Graph hace que Fess espere el tiempo que pida la cabeceraRetry-After(60 segundos si no indica nada utilizable, 60 minutos como máximo), y durante ese tiempo se omite toda consulta de grupos anidados en la instancia entera de Fess mientras las consultas directas siguen respondiendo. El fallo no es necesariamente definitivo: la resolución se reintenta cada vez que se renueva el token de acceso, y un éxito posterior hace desaparecer el mensaje y restaura los permisos que faltaban. Cerrar la sesión y volver a iniciarla lo reintenta de inmediato — abrir la URL de inicio de sesión SSO con la sesión aún iniciada solo redirige de vuelta a la pantalla de búsqueda
Configuración de depuración
Para investigar problemas, puede mostrar logs detallados relacionados con Entra ID ajustando el nivel de log de Fess.
En app/WEB-INF/classes/log4j2.xml, puede agregar el siguiente logger para cambiar el nivel de log:
Referencia
Configuración de Búsqueda Basada en Roles - Configuración de búsqueda basada en roles
Configuración de SSO con autenticación SAML - Configuración de SSO con autenticación SAML
Configuración de SSO con OpenID Connect - Configuración de SSO con autenticación OpenID Connect