Partilhar via


Usar o controle de acesso baseado em função em seu aplicativo Web Node.js

Aplica-se a:Círculo branco com um símbolo X cinzento. Locatários da força deCírculo verde com um símbolo de marca de verificação branco. 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