Usar o controle de acesso baseado em função em seu aplicativo Web Node.js
Aplica-se a: Locatários da força de trabalho Locatários externos (saiba mais)
O controle de acesso baseado em função (RBAC) é um mecanismo para impor a autorização em aplicativos. A ID Externa do Microsoft Entra permite que você defina funções de aplicativo para seu aplicativo e atribua essas funções a usuários e grupos. As funções atribuídas a um usuário ou grupo definem seu nível de acesso aos recursos e operações em seu aplicativo. Quando a ID externa emite um token de segurança para um usuário autenticado, ela inclui os nomes das funções atribuídas ao usuário ou grupo na declaração de funções do token de segurança.
Você também pode configurar seu locatário externo para retornar as associações de grupo do usuário. Os desenvolvedores podem usar grupos de segurança para implementar o RBAC em seus aplicativos, onde as associações do usuário em grupos específicos são interpretadas como suas associações de função.
Depois de atribuir usuários e grupos a funções, a declaração de funções é emitida em seu token de segurança. No entanto, para emitir a declaração de associação de grupos em tokens de segurança, você precisa de configuração adicional no locatário do cliente.
Neste artigo, você aprenderá a receber funções de usuário ou associação a grupos ou ambas como declarações em um token de segurança para seu aplicativo Web Node.js.
Pré-requisitos
Se você não tiver feito isso, conclua as etapas no artigo Usando controle de acesso baseado em função para aplicativos . Este artigo mostra como criar funções para seu aplicativo, como atribuir usuários e grupos a essas funções, como adicionar membros a um grupo e como adicionar uma declaração de grupo a um token de segurança. Saiba mais sobre tokens de ID e tokens de acesso.
Se você não tiver feito isso, conclua as etapas em Entrar usuários em seu próprio aplicativo Web Node.js
Receber declarações de grupos e funções na sua aplicação Web Node.js
Depois de configurar o locatário do cliente, você pode recuperar suas funções e declarações de grupos em seu aplicativo cliente. As declarações de funções e grupos estão presentes no token de ID e no token de acesso, mas seu aplicativo cliente só precisa verificar essas declarações no token de ID para implementar a autorização no lado do cliente. O aplicativo de API também pode recuperar essas declarações quando recebe o token de acesso.
Você verifica o valor da declaração de suas funções , conforme mostrado no exemplo de trecho de código a seguir:
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);
}
}
...
}
Se você atribuir um usuário a várias funções, a roles
cadeia de caracteres conterá todas as funções separadas por uma vírgula, como Orders.Manager,Store.Manager,...
. Certifique-se de criar seu aplicativo para lidar com as seguintes condições:
- ausência de
roles
reivindicação no token - usuário não foi atribuído a nenhuma função
- Vários valores na
roles
declaração quando você atribui um usuário a várias funções
Você também pode verificar o valor da declaração de seus grupos , conforme mostrado no seguinte exemplo de trecho de código:
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
let groups = tokenResponse.idTokenClaims.groups;
O valor da declaração dos grupos é o objectId do grupo. Se um usuário for membro de vários grupos, a groups
cadeia de caracteres conterá todos os grupos separados por uma vírgula, como 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-...
.
Nota
Se você atribuir a um usuário funções internas do Microsoft Entra ou comumente conhecidas como funções de diretório, essas funções aparecerão na declaração de grupos do token de segurança.
Lidar com grupos com excesso de idade
Para garantir que o tamanho do token de segurança não exceda o limite de tamanho do cabeçalho HTTP, a ID Externa limita o número de IDs de objeto que inclui na declaração de grupos . O limite de ultrapassagem é de 150 para tokens SAML e 200 para tokens JWT. É possível exceder esse limite se um usuário pertencer a muitos grupos e você solicitar para todos os grupos.
Detetar excesso de grupo em seu código-fonte
Se você não pode evitar excessos de grupos, então você precisa lidar com isso em seu código. Quando você excede o limite de excedente, o token não contém a declaração de grupos . Em vez disso, o token contém uma declaração _claim_names que contém um membro do grupo da matriz. Então, você precisa verificar a existência de _claim_names alegação para dizer que ocorreu um excesso de idade. O trecho de código a seguir mostra como detetar um excesso de grupo:
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
if(tokenResponse.idTokenClaims.hasOwnProperty('_claim_names') && tokenResponse.idTokenClaims['_claim_names'].hasOwnProperty('groups')) {
//overage has occurred
}
Use as instruções no artigo Configurando declarações de grupo e funções de aplicativo em tokens para saber como a solicitação da lista completa de grupos ocorre quando ocorre excesso de grupo.
Como usar grupos e valores de funções em seu aplicativo Web Node.js
No aplicativo cliente, você pode verificar se um usuário conectado tem a(s) função(ões) necessária(s) para acessar uma rota protegida ou chamar um ponto de extremidade de API. Isso pode ser feito verificando a roles
declaração no token de ID. Para implementar essa proteção em seu aplicativo, você pode criar proteções usando um middleware personalizado.
Em seu aplicativo de serviço (aplicativo de API), você também pode proteger os pontos de extremidade da API. Depois de validar o token de acesso enviado pelo aplicativo cliente, você pode verificar as declarações de funções ou grupos nas declarações de carga útil do token de acesso.
Utilizo Funções ou Grupos de Aplicações?
Neste artigo, você aprendeu que pode usar funções ou grupos de aplicativos para implementar o RBAC em seu aplicativo. A abordagem preferida é usar funções de aplicativo, pois fornece controle mais granular ao gerenciar acesso/permissões no nível do aplicativo. Para obter mais informações sobre como escolher uma abordagem, consulte Escolher uma abordagem.
Próximos passos
- Saiba mais sobre como configurar declarações de grupo e funções de aplicativo em tokens.