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

У меня есть простое веб-приложение ASP.Net, использующее Azure AD с аутентификацией/авторизацией ролей/заявлений. В основном приложение проверяет IsinRole() для пользователя, а затем, в зависимости от того, что возвращается, он получает доступ к области веб-приложения. Мы используем группы безопасности в Azure AD. Сценарий здесь: пользователь принадлежит к группе 1, и при входе в веб-приложение он получает доступ к области группы 1, теперь администратор на бэкэнде добавляет пользователя в группу 2, а мы хотим, чтобы пользователь не выходил из системы и снова не входил в портал. мы хотим, чтобы его токен также содержал эту недавно добавленную группу Group2. Можно ли каким-либо образом обновить токен, чтобы добавить дополнительную группу2 для этого токена пользователя, не выходя из системы и не входя в приложение?

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

Ценю твою помощь.

Спасибо.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
5
0
1 255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, такие как член, и вы можете выбрать в зависимости от ваших требований.

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

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

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

Детали сценария Overage для заявки groups в токене доступа

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

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

Спасибо, Рохит (Рохит Сайгал), на самом деле я создавал демоверсию для образца заявок на роли AD WebApp (azure.microsoft.com/en-us/resources/samples/…). Пока все работает нормально, когда я перемещаю пользователя из GroupA в GroupB. Мне нужно выйти из приложения и снова войти, чтобы проверить изменения. Мне нравится ваш подход к реализации, так как за 8 часов до моей демонстрации я думал, есть ли здесь выход без входа/выхода из системы. Спасибо!

user42012 10.04.2019 01:59

хорошо понял.. другой подход может состоять в том, чтобы использовать обновить токен для получения нового токен доступа без повторного запроса учетных данных пользователя. Я думаю, что утверждения группы/роли должны быть обновлены в новом токене доступа, но не проверял это. об этом здесь docs.microsoft.com/en-us/azure/active-directory/develop/… .. Хотя этот подход может быть немного более хрупким, поскольку токены обновления могут быть отозваны по нескольким причинам.. также в случае групповых претензий сценарии превышения не будут решаться в этом подходе.. Удачи с вашей демонстрацией !

Rohit Saigal 10.04.2019 03:36

Спасибо, Рохит, ценю ваши последующие действия и подробный ответ.

user42012 11.04.2019 02:02

Рохит, у вас есть идеи по реализации AquireTokenSilently() в .netcore? stackoverflow.com/questions/57134759/…

NewBieDevRo 22.07.2019 22:10

Другие вопросы по теме