Partager via


Utiliser le contrôle d’accès en fonction du rôle dans votre application web Node.js

S’applique à :Cercle blanc avec un symbole X gris. Locataires de main-d’œuvre Cercle vert avec un symbole de coche blanche. Locataires externes (en savoir plus)

Le contrôle d’accès en fonction du rôle (RBAC) est un mécanisme pour appliquer l’autorisation dans des applications. L'ID externe Microsoft Entra vous permet de définir des rôles d'application pour votre application et d'attribuer ces rôles à des utilisateurs et à des groupes. Les rôles que vous attribuez à un utilisateur ou à un groupe définissent leur niveau d’accès aux ressources et aux opérations de votre application. Lorsque l'ID externe émet un jeton de sécurité pour un utilisateur authentifié, il inclut les noms des rôles que vous avez attribués à l'utilisateur ou au groupe dans la revendication de rôles du jeton de sécurité.

Vous pouvez également configurer votre tenant externe pour qu’il retourne les appartenances aux groupes de l’utilisateur. Les développeurs peuvent ensuite utiliser des groupes de sécurité pour implémenter le contrôle d’accès en fonction du rôle (RABC) dans leurs applications, où les appartenances de l’utilisateur dans des groupes spécifiques sont interprétées comme leurs appartenances aux rôles.

Une fois que vous attribuez des rôles à des utilisateurs et des groupes, la revendication de rôles est émise dans votre jeton de sécurité. Toutefois, pour émettre la revendication d’appartenance aux groupes dans les jetons de sécurité, vous avez besoin d’une configuration supplémentaire dans le locataire de votre client.

Dans cet article, vous allez apprendre à recevoir des rôles d’utilisateur ou des appartenances à un groupe ou les deux en tant que revendications dans un jeton de sécurité pour votre application web Node.js.

Prérequis

Recevoir des revendications de groupes et de rôles dans votre application web Node.js

Une fois que vous avez configuré le locataire de votre client, vous pouvez récupérer vos revendications de rôles et de groupes dans votre application cliente. Les revendications de rôles et de groupes sont à la fois présentes dans le jeton d’ID et le jeton d’accès, mais votre application cliente doit uniquement vérifier ces revendications dans le jeton d’ID afin d’implémenter l’autorisation côté client. L’application API peut également récupérer ces revendications lorsqu’elle reçoit le jeton d’accès.

Vous vérifiez la valeur de revendication de vos rôles, comme illustré dans l’exemple d’extrait de code suivant :

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 vous attribuez plusieurs rôles à un utilisateur, la chaîne roles contient tous les rôles séparés par une virgule, comme Orders.Manager,Store.Manager,.... Veillez à générer votre application pour gérer les conditions suivantes :

  • absence de revendication roles dans le jeton
  • aucun rôle n’a été attribué à l’utilisateur
  • plusieurs valeurs dans la revendication roles lorsque vous attribuez plusieurs rôles à un utilisateur

Vous pouvez également vérifier la valeur de revendication de vos groupes, comme indiqué dans l’exemple d’extrait de code suivant :

const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
let groups = tokenResponse.idTokenClaims.groups;

La valeur de revendication de groupes est l’objectId du groupe. Si un utilisateur est membre de plusieurs groupes, la chaîne groups contient tous les groupes séparés par une virgule, comme 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-....

Remarque

Si vous attribuez à un utilisateur des rôles intégrés Microsoft Entra ou communément appelés rôles d'annuaire, ces rôles apparaissent dans la revendication de groupe du jeton de sécurité.

Gérer le dépassement de groupes

Pour garantir que la taille du jeton de sécurité ne dépasse pas la limite de taille de l'en-tête HTTP, l'ID externe limite le nombre d'ID d'objet qu'il inclut dans la revendication des groupes. La limite de dépassement est de 150 pour les jetons SAML et de 200 pour les jetons JWT. Il est possible de dépasser cette limite si un utilisateur appartient à de nombreux groupes et que vous demandez tous les groupes.

Détecter le dépassement de groupe dans votre code source

Si vous ne pouvez pas éviter les dépassements de groupes, vous devez les gérer dans votre code. Lorsque vous dépassez la limite de dépassement, le jeton ne contient pas la revendication de groupes. Au lieu de cela, le jeton contient une revendication _claim_names qui contient un membre de groupes du tableau. Vous devez donc vérifier l’existence de la revendication _claim_names pour indiquer qu’un dépassement s’est produit. L’extrait de code suivant vous montre comment détecter un dépassement de groupes :

const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);

if(tokenResponse.idTokenClaims.hasOwnProperty('_claim_names') && tokenResponse.idTokenClaims['_claim_names'].hasOwnProperty('groups')) {
    //overage has occurred
}

Utilisez les instructions de l’article Configuration des revendications de groupe et des rôles d’application dans les jetons pour découvrir comment demander la liste complète des groupes en cas de dépassement de groupes.

Guide pratique d’utilisation des valeurs de groupes et de rôles dans votre application web Node.js

Dans l’application cliente, vous pouvez vérifier si un utilisateur connecté dispose du ou des rôles nécessaires pour accéder à un itinéraire protégé ou appeler un point de terminaison d’API. Pour ce faire, vérifiez la revendication roles dans le jeton d’ID. Pour implémenter cette protection dans votre application, vous pouvez créer des protections à l’aide d’un intergiciel personnalisé.

Dans votre application de service (application API), vous pouvez également protéger les points de terminaison d’API. Après avoir validé le jeton d’accès envoyé par l’application cliente, vous pouvez vérifier les revendications de rôles ou de groupes dans les revendications de charge utile du jeton d’accès.

Est-ce que j’utilise des rôles ou des groupes d’application ?

Dans cet article, vous avez appris que vous pouvez utiliser des rôles d’application ou des groupes pour implémenter RBAC dans votre application. L’approche recommandée consiste à utiliser des rôles d’application, car cela procure un contrôle plus précis lors de la gestion des accès/autorisations au niveau de l’application. Pour obtenir davantage d’informations sur le choix d’une approche, consultez Choix de l’approche.

Étapes suivantes