Udostępnij za pośrednictwem


Używanie kontroli dostępu opartej na rolach w aplikacji internetowej Node.js

Dotyczy:Biały okrąg z szarym symbolem X. Dzierżawcy siły roboczej — dzierżawcy zewnętrzni Zielony okrąg z białym symbolem znacznika wyboru. (dowiedz się więcej)

Kontrola dostępu oparta na rolach (RBAC) to mechanizm wymuszania autoryzacji w aplikacjach. Tożsamość zewnętrzna Microsoft Entra umożliwia definiowanie ról aplikacji dla aplikacji i przypisywanie tych ról do użytkowników i grup. Role przypisywane do użytkownika lub grupy definiują ich poziom dostępu do zasobów i operacji w aplikacji. Gdy identyfikator zewnętrzny wystawia token zabezpieczający dla uwierzytelnionego użytkownika, zawiera nazwy ról przypisanych do użytkownika lub grupy w oświadczeniach ról tokenu zabezpieczającego.

Możesz również skonfigurować dzierżawę zewnętrzną w celu zwrócenia członkostw w grupach użytkownika. Deweloperzy mogą następnie używać grup zabezpieczeń do implementowania kontroli dostępu opartej na rolach w swoich aplikacjach, gdzie członkostwo użytkownika w określonych grupach jest interpretowane jako ich członkostwo w rolach.

Po przypisaniu użytkowników i grup do ról oświadczenie ról jest emitowane w tokenie zabezpieczającym. Jednak aby emitować oświadczenie członkostwa grup w tokenach zabezpieczających, potrzebna jest dodatkowa konfiguracja w dzierżawie klienta.

Z tego artykułu dowiesz się, jak odbierać role użytkownika lub członkostwo w grupie albo oba te oświadczenia w tokenie zabezpieczającym dla aplikacji internetowej Node.js.

Wymagania wstępne

Odbieranie oświadczeń grup i ról w aplikacji internetowej Node.js

Po skonfigurowaniu dzierżawy klienta możesz pobrać oświadczenia ról i grup w aplikacji klienckiej. Oświadczenia ról i grup znajdują się zarówno w tokenie identyfikatora, jak i tokenie dostępu, ale aplikacja kliencka musi sprawdzić tylko te oświadczenia w tokenie identyfikatora, aby zaimplementować autoryzację po stronie klienta. Aplikacja interfejsu API może również pobrać te oświadczenia po odebraniu tokenu dostępu.

Sprawdź wartość oświadczenia ról, jak pokazano w poniższym przykładzie fragmentu kodu:

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

Jeśli przypiszesz użytkownika do wielu ról, roles ciąg zawiera wszystkie role oddzielone przecinkami, takimi jak Orders.Manager,Store.Manager,.... Upewnij się, że skompilujesz aplikację, aby obsłużyć następujące warunki:

  • roles brak roszczenia w tokenie
  • użytkownik nie został przypisany do żadnej roli
  • wiele wartości w oświadczeniu roles podczas przypisywania użytkownika do wielu ról

Możesz również sprawdzić wartość oświadczenia grup , jak pokazano w poniższym przykładzie fragmentu kodu:

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

Wartość oświadczenia grup jest objectId grupy. Jeśli użytkownik jest członkiem wielu grup, groups ciąg zawiera wszystkie grupy oddzielone przecinkami, takimi jak 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-....

Uwaga

Jeśli przypiszesz użytkownikowi microsoft Entra wbudowane role lub powszechnie znane jako role katalogu, te role są wyświetlane w oświadczeniach grup tokenu zabezpieczającego.

Obsługa nadwyżek grup

Aby upewnić się, że rozmiar tokenu zabezpieczającego nie przekracza limitu rozmiaru nagłówka HTTP, identyfikator zewnętrzny ogranicza liczbę identyfikatorów obiektów uwzględnionych w oświadczeniach grup . Limit nadwyżki wynosi 150 dla tokenów SAML i 200 dla tokenów JWT. Istnieje możliwość przekroczenia tego limitu, jeśli użytkownik należy do wielu grup i zażądasz wszystkich grup.

Wykrywanie nadwyżki grup w kodzie źródłowym

Jeśli nie możesz uniknąć nadwyżkowych grup, musisz go obsłużyć w kodzie. Po przekroczeniu limitu nadwyżkowego token nie zawiera oświadczenia grup . Zamiast tego token zawiera oświadczenie _claim_names , które zawiera element członkowski grupy tablicy. Dlatego należy sprawdzić istnienie oświadczenia _claim_names , aby poinformować, że wystąpiła nadwyżka. Poniższy fragment kodu pokazuje, jak wykryć nadwyżkę grup:

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

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

Skorzystaj z instrukcji w artykule Konfigurowanie oświadczeń grup i ról aplikacji w tokenach , aby dowiedzieć się, jak zażądać pełnej listy grup, gdy wystąpi nadwyżka grup.

Jak używać wartości grup i ról w aplikacji internetowej Node.js

W aplikacji klienckiej możesz sprawdzić, czy zalogowany użytkownik ma niezbędne role w celu uzyskania dostępu do chronionej trasy lub wywołania punktu końcowego interfejsu API. Można to zrobić, sprawdzając roles oświadczenie w tokenie identyfikatora. Aby zaimplementować tę ochronę w aplikacji, można tworzyć zabezpieczenia przy użyciu niestandardowego oprogramowania pośredniczącego.

W aplikacji usługi (aplikacji interfejsu API) można również chronić punkty końcowe interfejsu API. Po zweryfikowaniu tokenu dostępu wysyłanego przez aplikację kliencją można sprawdzić oświadczenia ról lub grup w oświadczeniach ładunku tokenu dostępu.

Czy używam ról lub grup aplikacji?

W tym artykule przedstawiono, że możesz użyć ról aplikacji lub grup do zaimplementowania kontroli dostępu opartej na rolach w aplikacji. Preferowaną metodą jest użycie ról aplikacji, ponieważ zapewnia bardziej szczegółową kontrolę podczas zarządzania dostępem/uprawnieniami na poziomie aplikacji. Aby uzyskać więcej informacji na temat wybierania podejścia, zobacz Wybieranie podejścia.

Następne kroki