Uso del control de acceso basado en roles en la aplicación web de Node.js
Se aplica a: inquilinos de personal inquilinos externos (más información)
El control de acceso basado en roles (RBAC) es un mecanismo para exigir la autorización en las aplicaciones. Id. externa de Microsoft Entra le permite definir roles de aplicación para su aplicación y asignar dichos roles a usuarios y grupos. Los roles que asigna a un usuario o grupo definen su nivel de acceso a los recursos y operaciones de la aplicación. Cuando Id. externa emite un token de seguridad para un usuario autenticado, incluye los nombres de los roles que ha asignado al usuario o grupo en la declaración de roles del token de seguridad.
También puede configurar el inquilino externo para que devuelva las membresías de grupos del usuario. Los desarrolladores pueden entonces usar grupos de seguridad para implementar el control de acceso basado en roles en sus aplicaciones, donde las pertenencias de los usuarios en grupos específicos se interpretan como pertenencias a roles.
Una vez que asigne usuarios y grupos a roles, la notificación de roles se emite en el token de seguridad. Sin embargo, para emitir la notificación de pertenencia a grupos en tokens de seguridad, necesita una configuración adicional en el inquilino del cliente.
En este artículo, aprenderá a recibir roles de usuario, pertenencia a grupos o ambos como notificaciones en un token de seguridad para la aplicación web de Node.js.
Requisitos previos
Si no lo ha hecho, complete los pasos descritos en el artículo Uso del control de acceso basado en rol para aplicaciones. En este artículo se muestra cómo crear roles para la aplicación, cómo asignar usuarios y grupos a esos roles, cómo agregar miembros a un grupo y cómo agregar una notificación de grupo a un token de seguridad. Obtenga más información sobre los tokens de identificador y los tokens de acceso.
Si no lo ha hecho, complete los pasos descritos en Iniciar sesión de usuarios en su propia aplicación web Node.js
Recepción de notificaciones de grupos y roles en la aplicación web de Node.js
Una vez configurado el inquilino del cliente, puede recuperar los roles y las notificaciones de grupos en la aplicación cliente. Los roles y las notificaciones de grupos están presentes tanto en el token de identificador como en el token de acceso, pero la aplicación cliente solo necesita comprobar estas notificaciones en el token de identificador para implementar la autorización en el lado cliente. La aplicación de API también puede recuperar estas notificaciones cuando recibe el token de acceso.
Compruebe el valor de notificación de roles tal como se muestra en el ejemplo de fragmento de código siguiente:
const msal = require('@azure/msal-node');
const { msalConfig, TENANT_SUBDOMAIN, REDIRECT_URI, POST_LOGOUT_REDIRECT_URI } = require('../authConfig');
...
class AuthProvider {
...
async handleRedirect(req, res, next) {
const authCodeRequest = {
...req.session.authCodeRequest,
code: req.body.code, // authZ code
codeVerifier: req.session.pkceCodes.verifier, // PKCE Code Verifier
};
try {
const msalInstance = this.getMsalInstance(this.config.msalConfig);
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
let roles = tokenResponse.idTokenClaims.roles;
//Check roles
if (roles && roles.includes("Orders.Manager")) {
//This user can view the ID token claims page.
res.redirect('/id');
}
//User can only view the index page.
res.redirect('/');
} catch (error) {
next(error);
}
}
...
}
Si asigna un usuario a varios roles, la cadena roles
contiene todos los roles separados por una coma, como Orders.Manager,Store.Manager,...
. Asegúrese de compilar la aplicación para controlar las condiciones siguientes:
- ausencia de notificación de
roles
en el token - el usuario no se ha asignado a ningún rol
- varios valores de la notificación de
roles
al asignar un usuario a varios roles
También puede comprobar el valor de notificación de grupos tal como se muestra en el ejemplo de fragmento de código siguiente:
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
let groups = tokenResponse.idTokenClaims.groups;
El valor de notificación de grupos es el objectId del grupo. Si un usuario es miembro de varios grupos, la cadena groups
contiene todos los grupos separados por una coma, como 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-...
.
Nota:
Si usted asigna a un usuario roles incorporados de Microsoft Entra o comúnmente conocidos como roles de directorio, esos roles aparecen en el reclamo de grupos del token de seguridad.
Control del uso por encima del límite de grupos
Para garantizar que el tamaño del token de seguridad no supere el límite de tamaño del encabezado HTTP, Id. externa limita el número de id. de objetos que incluye en la solicitud de grupos. El límite de uso por encima del límite es 150 para tokens SAML y 200 para tokens JWT. Es posible superar este límite si un usuario pertenece a muchos grupos y solicita todos los grupos.
Detección del uso por encima del límite de grupo en el código fuente
Si no puede evitar el uso por encima del límite de grupos, debe controlarlo en el código. Cuando se supera el límite de uso por encima del límite, el token no contiene la notificación de grupos. En su lugar, el token contiene una notificación _claim_names que contiene un miembro de grupos de la matriz. Por lo tanto, debe comprobar la existencia de la notificación _claim_names para indicar que se ha producido un uso por encima del límite. El siguiente fragmento de código muestra cómo detectar un uso por encima del límite de grupos:
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
if(tokenResponse.idTokenClaims.hasOwnProperty('_claim_names') && tokenResponse.idTokenClaims['_claim_names'].hasOwnProperty('groups')) {
//overage has occurred
}
Siga las instrucciones del artículo Configuración de notificaciones de grupo y roles de aplicación en tokens para obtener información sobre cómo solicitar la lista completa de grupos cuando se produce el uso por encima del límite de grupos.
Uso de los valores de grupos y roles en la aplicación web de Node.js
En la aplicación cliente, puede comprobar si un usuario que ha iniciado sesión tiene los roles necesarios para acceder a una ruta protegida o llamar a un punto de conexión de API. Para ello, compruebe la notificación de roles
en el token de identificador. Para implementar esta protección en la aplicación, puede crear restricciones mediante un middleware personalizado.
En la aplicación de servicio (aplicación de API), también puede proteger los puntos de conexión de API. Después de validar el token de acceso enviado por la aplicación cliente, puede comprobar si hay roles o notificaciones de grupos en las notificaciones de carga del token de acceso.
¿Uso roles de aplicación o grupos?
En este artículo, ha aprendido que puede usar roles de aplicación o grupos para implementar RBAC en la aplicación. El enfoque preferido es usar roles de aplicación, ya que proporcionan un control más pormenorizado al administrar el acceso o los permisos en el nivel de aplicación. Para obtener más información sobre cómo elegir un enfoque, consulte Elección de un enfoque.
Pasos siguientes
- Obtenga más información sobre la Configuración de notificaciones de grupo y roles de aplicación en tokens.