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


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

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

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

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

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

В этой статье вы узнаете, как получать роли пользователей или членство в группах, или и то и другое в виде утверждений в маркере безопасности для веб-приложения 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;

Значение, на которое претендует группа, — это objectId группы . Если пользователь является членом нескольких групп, строка 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 в ID токене. Для реализации этой защиты в приложении можно создавать механизм защиты с помощью пользовательского промежуточного программного обеспечения.

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

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

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

Дальнейшие действия