Обновить токен автоматически и добавить новые группы безопасности пользователей Azure AD

У меня есть простое веб-приложение ASP.Net, использующее Azure AD с аутентификацией / авторизацией ролей / утверждений. В основном приложение проверяет IsinRole () для пользователя, а затем, в зависимости от того, что возвращается, он получает доступ к области веб-приложения. Мы используем ГРУППЫ БЕЗОПАСНОСТИ в Azure AD. Сценарий здесь: пользователь принадлежит к Group1, и при входе в веб-приложение он получает доступ к области Group1, теперь администратор на бэкэнде добавляет пользователя в Group2, а мы хотим, чтобы пользователь не выходил из системы и не входил обратно в портал. мы хотим, чтобы его токен также содержал эту недавно добавленную Group2. Есть ли способ обновить токен, чтобы добавить дополнительную группу group2 для этого токена пользователя, не выходя из системы и не заходя в приложение?

Есть ли способ принудительно обновить токен новой информацией?

Ценю вашу помощь.

Спасибо.


person user42012    schedule 09.04.2019    source источник


Ответы (1)


Обновите токен, чтобы получить новый токен доступа

Один из подходов может заключаться в использовании Refresh Token для получения нового Access Token, если вы используете грант, например предоставление кода авторизации, в своем веб-приложении.

Подробнее об этом можно прочитать здесь - Обновление токенов доступа

Ваше приложение должно будет решить, когда получить новый токен доступа ... чтобы оно могло это сделать, когда узнает, что членство в группе было обновлено внутренним компонентом / администратором.

Теперь отдельная тема, о которой вы особо не упомянули, - это то, как ваше веб-приложение, в котором пользователь уже вошел в систему, узнает о таком событии, но что-то вроде уведомления SingalR может помочь.

На заметку:

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

  • Жетоны обновления должны храниться в надежном месте.

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


Альтернативный подход (вместо попытки принудительно обновить токен новой информацией, о которой вы упомянули)

Если вам нужно groups утверждение, тогда используйте Microsoft Graph API для получения информации о группах безопасности, к которым принадлежит пользователь, вместо того, чтобы смотреть только на токен доступа.

Код вашего приложения может снова вызвать Microsoft Graph API в любой момент, чтобы получить новые данные о членстве, например, группу 1 и группу 2, как в вашем примере (когда он знает, что членство в группе было обновлено внутренним компонентом / администратором). SignalR или какой-либо другой способ уведомить ваше приложение о таких изменениях также будет уместен здесь.

Соответствующие API Microsoft Graph

  • пользователь: GetMemberGroups

    POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/getMemberGroups
    

    Это только один, который кажется мне актуальным, но есть и другие похожие API, такие как memberOf, и вы можете выбрать, исходя из ваших требований.

Преимущества

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

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

Подробная информация об избыточном сценарии для groups заявки в токене доступа

В настоящее время вы, возможно, отредактировали манифест своего приложения и установили для свойства "groupMembershipClaims" значение "All" или "SecurityGroup", чтобы токен доступа получил groups утверждение со всеми идентификаторами групп, к которым принадлежит пользователь.

введите описание изображения здесь

Чтобы гарантировать, что размер токена не превышает ограничения размера заголовка HTTP, Azure AD ограничивает количество идентификаторов объектов, которые он включает в утверждение групп. Если пользователь является участником большего количества групп, чем установленный предел (150 для токенов SAML, 200 для токенов JWT), то Azure AD не отправляет утверждение групп в токене. Вместо этого он включает в токен утверждение о превышении, которое указывает приложению запрашивать Graph API для получения членства пользователя в группе.

person Rohit Saigal    schedule 09.04.2019
comment
Спасибо, Рохит (Рохит Сайгал), я фактически создавал демонстрацию для примера утверждений ролей AD WebApp (azure.microsoft.com/en-us/resources/samples/). Пока все работает нормально, когда я перемещаю пользователя из GroupA в GroupB. Мне нужно выйти из приложения и снова войти, чтобы проверить изменения. Мне нравится ваш подход к реализации, потому что, имея в руках еще 8 часов перед демонстрацией, я думал, есть ли здесь выход без входа в систему / выхода из системы. Спасибо! - person user42012; 10.04.2019
comment
хорошо, понятно .. Другой подход может заключаться в использовании токена обновления для получения нового токена доступа без повторного запроса учетных данных у пользователя .. Я думаю, что утверждения группы / роли должны быть обновлены в новый токен доступа, но не тестировал ... Вы можете прочитать об этом здесь docs.microsoft.com/en-us/azure/active-directory/develop/ .. Хотя этот подход может быть немного более хрупкий, так как токены обновления могут быть отозваны по нескольким причинам ... также в случае групповых заявлений, при таком подходе не будут рассматриваться сценарии избыточности ... Удачи вам с демонстрацией! - person Rohit Saigal; 10.04.2019
comment
Спасибо, Рохит, ценим ваши последующие действия и подробный ответ. - person user42012; 11.04.2019
comment
Рохит, у вас есть идея о реализации AquireTokenSilently () в .netcore? stackoverflow.com/questions/57134759/ - person NewBieDevRo; 22.07.2019