Share via


Använda rollbaserad åtkomstkontroll i ditt Node.js webbprogram

Gäller för:Vit cirkel med en grå X-symbol.Personalklientorganisationer Grön cirkel med en vit bockmarkeringssymbol. Externa klienter (läs mer)

Rollbaserad åtkomstkontroll (RBAC) är en mekanism för att framtvinga auktorisering i program. Med Microsoft Entra External ID kan du definiera programroller för ditt program och tilldela dessa roller till användare och grupper. De roller som du tilldelar en användare eller grupp definierar deras åtkomstnivå till resurserna och åtgärderna i ditt program. När externt ID utfärdar en säkerhetstoken för en autentiserad användare innehåller det namnen på de roller som du har tilldelat användaren eller gruppen i anspråket för säkerhetstokens roller.

Du kan också konfigurera den externa klientorganisationen så att den returnerar användarens gruppmedlemskap. Utvecklare kan sedan använda säkerhetsgrupper för att implementera RBAC i sina program, där användarens medlemskap i specifika grupper tolkas som deras rollmedlemskap.

När du tilldelar användare och grupper till roller genereras rollanspråket i din säkerhetstoken. Men för att generera anspråket för gruppmedlemskap i säkerhetstoken behöver du ytterligare konfiguration i kundens klientorganisation.

I den här artikeln lär du dig att ta emot användarroller eller gruppmedlemskap eller båda som anspråk i en säkerhetstoken för din Node.js webbapp.

Förutsättningar

Ta emot grupper och rollanspråk i din Node.js webbapp

När du har konfigurerat kundens klientorganisation kan du hämta dina roller och gruppanspråk i klientappen. Rollernaoch gruppernas anspråk finns båda i ID-token och åtkomsttoken, men klientappen behöver bara söka efter dessa anspråk i ID-token för att implementera auktorisering på klientsidan. API-appen kan också hämta dessa anspråk när den tar emot åtkomsttoken.

Du kontrollerar anspråksvärdet för dina roller enligt följande kodfragmentexempel:

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);
        }
    }
...
}

Om du tilldelar en användare flera roller innehåller strängen roles alla roller avgränsade med ett kommatecken, till exempel Orders.Manager,Store.Manager,.... Se till att du skapar ditt program för att hantera följande villkor:

  • avsaknad av roles anspråk i token
  • användaren har inte tilldelats någon roll
  • flera värden i anspråket roles när du tilldelar en användare till flera roller

Du kan också kontrollera dina gruppers anspråksvärde enligt följande kodfragmentexempel:

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

Anspråksvärdet för grupper är gruppens objectId. Om en användare är medlem i flera grupper innehåller strängen groups alla grupper avgränsade med ett kommatecken, till exempel 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-....

Kommentar

Om du tilldelar en användare microsoft entra-inbyggda roller eller ofta kallas katalogroller, visas dessa roller i gruppanspråket för säkerhetstoken.

Hantera överförbrukning av grupper

För att säkerställa att storleken på säkerhetstoken inte överskrider storleksgränsen för HTTP-huvuden begränsar externt ID antalet objekt-ID:t som ingår i gruppanspråket. Överförbrukningsgränsen är 150 för SAML-token och 200 för JWT-token. Det går att överskrida den här gränsen om en användare tillhör många grupper och du begär för alla grupper.

Identifiera gruppöverförbrukning i källkoden

Om du inte kan undvika överförbrukning av grupper måste du hantera det i koden. När du överskrider överförbrukningsgränsen innehåller token inte gruppanspråket. I stället innehåller token ett _claim_names anspråk som innehåller en gruppmedlem i matrisen. Så du måste kontrollera förekomsten av _claim_names anspråk för att berätta att ett överförbrukning har inträffat. Följande kodfragment visar hur du identifierar överförbrukning av grupper:

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

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

Använd anvisningarna i artikeln Konfigurera gruppanspråk och approller i token för att lära dig hur du begär en fullständig grupplista när gruppöverförbrukning inträffar.

Så här använder du grupper och roller i din Node.js webbapp

I klientappen kan du kontrollera om en inloggad användare har de roller som krävs för att komma åt en skyddad väg eller anropa en API-slutpunkt. Detta kan göras genom att kontrollera anspråket roles i ID-token. Om du vill implementera det här skyddet i din app kan du skapa skydd med hjälp av ett anpassat mellanprogram.

I din tjänstapp (API-app) kan du också skydda API-slutpunkterna. När du har verifierat åtkomsttoken som skickas av klientappen kan du söka efter roll- eller gruppanspråken i nyttolastanspråken för åtkomsttoken.

Använder jag approller eller -grupper?

I den här artikeln har du lärt dig att du kan använda approller eller grupper för att implementera RBAC i ditt program. Den bästa metoden är att använda approller eftersom det ger mer detaljerad kontroll när du hanterar åtkomst/behörigheter på programnivå. Mer information om hur du väljer en metod finns i Välj en metod.

Nästa steg