Поделиться через


Использование управления доступом на основе ролей в веб-приложении Node.js

Область применения: Белый круг с серым символом X. клиенты рабочей силы внешниеЗеленый круг с белым проверка символом знака. клиенты (дополнительные сведения)

Управление доступом на основе ролей (RBAC) — это механизм принудительной авторизации в приложениях. Внешняя идентификация Microsoft Entra позволяет определять роли приложений для приложения и назначать эти роли пользователям и группам. Роли, назначенные пользователю или группе, определяют уровень доступа к ресурсам и операциям в приложении. Когда внешний идентификатор выдает маркер безопасности для прошедшего проверку подлинности пользователя, он содержит имена ролей, назначенных пользователю или группе в утверждении ролей маркера безопасности.

Вы также можете настроить внешний клиент для возврата членства в группах пользователя. Затем разработчики могут использовать группы безопасности для реализации RBAC в своих приложениях, где членства пользователя в определенных группах интерпретируются как членства в роли.

После назначения пользователям и группам ролей утверждение ролей создается в маркере безопасности. Однако для выдачи утверждения о членстве в группах в маркерах безопасности требуется дополнительная конфигурация в клиенте клиента.

В этой статье вы узнаете, как получать роли пользователей или членство в группах или как утверждения в маркере безопасности для веб-приложения Node.js.

Необходимые компоненты

Получение утверждений групп и ролей в веб-приложении Node.js

После настройки клиента можно получить утверждения ролей и групп в клиентском приложении. Утверждения ролей и групп присутствуют в маркере идентификатора и маркере доступа, но клиентское приложение должно только проверка для этих утверждений в маркере идентификатора для реализации авторизации на стороне клиента. Приложение API также может получить эти утверждения при получении маркера доступа.

Вы проверка значение утверждения ролей, как показано в следующем примере фрагмента кода:

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

При назначении пользователя нескольким ролям roles строка содержит все роли, разделенные запятой, например Orders.Manager,Store.Manager,.... Убедитесь, что вы создаете приложение для обработки следующих условий:

  • roles отсутствие утверждения в маркере
  • пользователь не был назначен какой-либо роли
  • несколько значений в утверждении roles при назначении пользователю нескольких ролей

Вы также можете проверка значение утверждения групп, как показано в следующем примере фрагмента кода:

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

Значение утверждения групп — объектная идентификатор группы. Если пользователь является членом нескольких групп, groups строка содержит все группы, разделенные запятой, например 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-....

Примечание.

При назначении пользователем встроенных ролей Microsoft Entra или ролей каталога, эти роли отображаются в утверждениях группы маркера безопасности.

Обработка переполнения групп

Чтобы гарантировать, что размер маркера безопасности не превышает предел размера заголовка HTTP, внешний идентификатор ограничивает количество идентификаторов объектов, которые он включает в утверждение групп . Ограничение превышения составляет 150 для токенов SAML и 200 для токенов JWT. Это ограничение можно превысить, если пользователь принадлежит многим группам, и вы запрашиваете все группы.

Обнаружение превышения группы в исходном коде

Если вы не можете избежать превышения групп, необходимо обработать его в коде. При превышении превышения лимита превышения маркер не содержит утверждения групп . Вместо этого маркер содержит утверждение _claim_names , содержащее элемент группы массива. Таким образом, необходимо проверка существование _claim_names утверждения, чтобы сказать, что превышение произошло. В следующем фрагменте кода показано, как обнаружить переполнение групп:

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

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

Инструкции по настройке утверждений групп и ролей приложений в статье маркеров показано, как запрашивать полный список групп при превышении групп.

Использование групп и ролей в веб-приложении Node.js

В клиентском приложении можно проверить, имеет ли пользователь вошедшего пользователя необходимые роли для доступа к защищенному маршруту или вызова конечной точки API. Это можно сделать, проверка roles утверждения в маркере идентификатора. Для реализации этой защиты в приложении можно создавать охранники с помощью пользовательского ПО промежуточного слоя.

В приложении-службе (приложение API) можно также защитить конечные точки API. После проверки маркера доступа, отправленного клиентским приложением, можно проверка для ролей или групп утверждений в утверждениях полезных данных маркера доступа.

Можно ли использовать роли или группы приложений?

В этой статье вы узнали, что вы можете использовать роли приложения или группы для реализации RBAC в приложении. Предпочтительный подход — использовать роли приложения, так как он обеспечивает более детализированный контроль при управлении доступом и разрешениями на уровне приложения. Дополнительные сведения см. в разделе Выбор подхода.

Следующие шаги