Använda rollbaserad åtkomstkontroll i ditt Node.js webbprogram
Gäller för: Personalklientorganisationer
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
Om du inte har gjort det slutför du stegen i artikeln Använda rollbaserad åtkomstkontroll för program . Den här artikeln visar hur du skapar roller för ditt program, hur du tilldelar användare och grupper till dessa roller, hur du lägger till medlemmar i en grupp och hur du lägger till ett gruppanspråk i en säkerhetstoken. Läs mer om ID-token och åtkomsttoken.
Om du inte har gjort det slutför du stegen i Logga in användare i din egen Node.js webbapp
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. Rollerna och 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.