Używanie kontroli dostępu opartej na rolach w aplikacji internetowej Node.js
Dotyczy: Dzierżawcy siły roboczej — dzierżawcy zewnętrzni (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
Jeśli nie zostało to zrobione, wykonaj kroki opisane w artykule Korzystanie z kontroli dostępu opartej na rolach dla aplikacji . W tym artykule pokazano, jak utworzyć role dla aplikacji, jak przypisać użytkowników i grupy do tych ról, jak dodać członków do grupy i jak dodać oświadczenie grupy do tokenu zabezpieczającego. Dowiedz się więcej o tokenach identyfikatorów i tokenach dostępu.
Jeśli nie zostało to zrobione, wykonaj kroki opisane w artykule Logowanie użytkowników we własnej aplikacji internetowej Node.js
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
- Dowiedz się więcej na temat konfigurowania oświadczeń grup i ról aplikacji w tokenach.