Teilen über


Verwenden der rollenbasierten Zugriffskontrolle in Ihrer Node.js-Webanwendung

Gilt für: Weißer Kreis mit grauem X. Mitarbeitermandanten Grüner Kreis mit weißem Häkchen. Externe Mandanten (weitere Informationen)

Die rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC) ist eine Methode zum Erzwingen der Autorisierung in Anwendungen. Mit Microsoft Entra External ID können Sie Anwendungsrollen für Ihre Anwendung definieren und diese Rollen Benutzern und Gruppen zuweisen. Die Rollen, die Sie einem Benutzer oder einer Gruppe zuweisen, definieren deren Zugriffsebene auf die Ressourcen und Vorgänge in Ihrer Anwendung. Wenn External ID ein Sicherheitstoken für einen authentifizierten Benutzer ausstellt, schließt es im Rollenanspruch des Sicherheitstokens die Namen der Rollen ein, die Sie dem Benutzer oder der Gruppe zugewiesen haben,.

Sie können Ihren externen Mandanten auch so konfigurieren, dass die Gruppenmitgliedschaften des Benutzers zurückgegeben werden. Entwickler können die rollenbasierte Zugriffssteuerung dann mithilfe von Sicherheitsgruppen in ihren Anwendungen implementieren. Dabei werden die Mitgliedschaften der Benutzer in spezifischen Gruppen als deren Rollenmitgliedschaften interpretiert.

Nachdem Sie Benutzer und Gruppen zu Rollen zugewiesen haben, wird der Rollenanspruch in Ihrem Sicherheitstoken ausgegeben. Um jedoch den Mitgliedschaftsanspruch Gruppen in Sicherheitstoken auszugeben, benötigen Sie eine zusätzliche Konfiguration im Mandanten Ihres Kunden.

In diesem Artikel erfahren Sie, wie Sie Benutzerrollen oder Gruppenmitgliedschaften oder beides als Ansprüche in einem Sicherheitstoken für Ihre Node.js-Web-App erhalten.

Voraussetzungen

Empfangen von Gruppen- und Rollenansprüchen in Ihrer Node.js-Web-App

Nachdem Sie den Mandanten Ihres Kunden konfiguriert haben, können Sie Ihre Ansprüche für Rollen und Gruppen in Ihrer Client-App abrufen. Die Ansprüche für Rollen und Gruppen sind sowohl im ID-Token als auch im Zugriffstoken vorhanden. Ihre Client-App muss jedoch nur im ID-Token nach diesen Ansprüchen suchen, um die Autorisierung auf Clientseite zu implementieren. Die API-App kann diese Ansprüche auch abrufen, wenn sie das Zugriffstoken empfängt.

Sie überprüfen Ihren Anspruchswert für die Rolle wie im folgenden Codeausschnittbeispiel gezeigt:

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

Wenn Sie einen Benutzer mehreren Rollen zuweisen, enthält die roles-Zeichenfolge alle Rollen, die durch ein Komma getrennt sind, z. B. Orders.Manager,Store.Manager,.... Stellen Sie sicher, dass Sie Ihre Anwendung so erstellen, dass die folgenden Bedingungen behandelt werden:

  • Fehlender roles-Anspruch im Token
  • Benutzer wurde keiner Rolle zugewiesen
  • Mehrere Werte im roles-Anspruch, wenn Sie einen Benutzer mehreren Rollen zuweisen

Sie können auch Ihren Anspruchswert für die Rolle wie im folgenden Codeausschnittbeispiel gezeigt überprüfen:

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

Der Gruppenanspruchswert ist die objectId der Gruppe. Wenn ein Benutzer Mitglied mehrerer Gruppen ist, enthält die Zeichenfolge groups alle Gruppen, die durch ein Komma getrennt sind, z. B. 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-....

Hinweis

Wenn Sie einem Benutzer integrierte Microsoft Entra-Rollen zuweisen – allgemein als Verzeichnisrollen bekannt –, werden diese Rollen im Anspruch der Gruppen des Sicherheitstokens angezeigt.

Behandeln von Gruppenüberschreitung

Um sicherzustellen, dass die Größe des Sicherheitstokens die HTTP-Header-Größenbeschränkung nicht überschreitet, begrenzt External ID die Anzahl der Objekt-IDs, die es in den Anspruch der Gruppen einschließt. Der Grenzwert für Überschreitungen beträgt 150 für SAML-Token und 200 für JWT-Token. Es ist möglich, diesen Grenzwert zu überschreiten, wenn ein Benutzer zu vielen Gruppen gehört und Sie alle Gruppen anfordern.

Erkennen einer Gruppenüberlastung im Quellcode

Wenn Sie Überschreitungen von Gruppen nicht vermeiden können, müssen Sie dies in Ihrem Code behandeln. Wenn Sie den Grenzwert für Überschreitungen überschreiten, enthält das Token nicht den Anspruch für Gruppen. Stattdessen enthält das Token einen _claim_names-Anspruch, der ein Gruppenmitglied des Arrays enthält. Sie müssen also überprüfen, ob der _claim_names-Anspruch vorhanden ist, um festzustellen, dass eine Überschreitung aufgetreten ist. Der folgende Codeausschnitt zeigt, wie Sie eine Gruppenüberschreitung erkennen:

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

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

Verwenden Sie die Anweisungen im Artikel Konfigurieren von Gruppenansprüchen und App-Rollen in Token, um zu erfahren, wie die vollständige Gruppenliste angefordert wird, wenn eine Gruppenüberschreitung auftritt.

Verwenden von Gruppen- und Rollenwerten in Ihrer Node.js-Web-App

In der Client-App können Sie überprüfen, ob ein angemeldeter Benutzer über die erforderlichen Rollen verfügt, um auf eine geschützte Route zuzugreifen oder einen API-Endpunkt aufzurufen. Dies kann durch Überprüfen des roles-Anspruchs im ID-Token erfolgen. Um diesen Schutz in Ihrer App zu implementieren, können Sie Wächter mithilfe einer benutzerdefinierten Middleware erstellen.

In Ihrer Dienst-App (API-App) können Sie auch die API-Endpunkte schützen. Nachdem Sie das von der Client-App gesendete Zugriffstoken überprüft haben, können Sie in den Nutzlastansprüchen des Zugriffstokens nach den Ansprüchen für Rollen oder Gruppen suchen.

Verwende ich App-Rollen oder -Gruppen?

In diesem Artikel haben Sie erfahren, dass Sie App-Rollen oder -Gruppen verwenden können, um RBAC in Ihrer Anwendung zu implementieren. Der bevorzugte Ansatz besteht darin, App-Rollen zu verwenden, da diese eine präzisere Kontrolle bei der Verwaltung des Zugriffs/der Berechtigungen auf Anwendungsebene bieten. Weitere Informationen über die Auswahl eines Ansatzes finden Sie unter Auswählen eines Ansatzes.

Nächste Schritte