У меня есть простое веб-приложение ASP.Net, использующее Azure AD с аутентификацией/авторизацией ролей/заявлений. В основном приложение проверяет IsinRole() для пользователя, а затем, в зависимости от того, что возвращается, он получает доступ к области веб-приложения. Мы используем группы безопасности в Azure AD. Сценарий здесь: пользователь принадлежит к группе 1, и при входе в веб-приложение он получает доступ к области группы 1, теперь администратор на бэкэнде добавляет пользователя в группу 2, а мы хотим, чтобы пользователь не выходил из системы и снова не входил в портал. мы хотим, чтобы его токен также содержал эту недавно добавленную группу Group2. Можно ли каким-либо образом обновить токен, чтобы добавить дополнительную группу2 для этого токена пользователя, не выходя из системы и не входя в приложение?
Любой способ принудительно обновить токен с новой информацией?
Ценю твою помощь.
Спасибо.
Обновите токен, чтобы получить новый токен доступа
Одним из подходов может быть использование Refresh Token
для получения нового Access Token
, если вы используете грант, такой как грант кода авторизации, в своем веб-приложении.
Подробнее об этом можно прочитать здесь - Обновление токенов доступа
Вашему приложению нужно будет решить, когда получить новый токен доступа... чтобы оно могло сделать это, когда оно узнает, что членство в группе было обновлено серверным компонентом/администратором.
Теперь отдельная тема, о которой вы почти не упоминали, — как ваше веб-приложение, в котором пользователь уже вошел в систему, узнает о таком событии, но что-то вроде уведомления SingalR может помочь.
Что следует отметить:
Работа с токенами обновления может быть немного сложной, поскольку они могут быть отозваны по причинам, не контролируемым вашим приложением (например, изменение пароля для пользователя, истечение срока действия, хотя это долго, и другие причины). В случае таких ошибок единственным оставшимся вариантом будет получение нового кода авторизации.
Жетоны обновления должны храниться в надежном месте
В частности, в случае претензий groups
могут быть сценарии превышения срока действия, когда один только токен доступа может не помочь.
Альтернативный подход (вместо того, чтобы пытаться принудительно обновить токен с новой информацией, как вы упомянули)
Если вам нужна претензия groups
, используйте Microsoft Graph API
для получения информации о группах безопасности, к которым принадлежит пользователь, вместо того, чтобы смотреть только на токен доступа.
Код вашего приложения может снова вызвать Microsoft Graph API в любой момент, чтобы получить новые сведения о членстве, т. е. группу 1 и группу 2, как в вашем примере (когда ему известно, что членство в группе было обновлено серверным компонентом/администратором). SignalR или какой-либо другой способ уведомить ваше приложение о таких изменениях также будет уместным.
Соответствующие API Microsoft Graph
POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/getMemberGroups
Это только один, который кажется мне актуальным, но есть и другие похожие API, такие как член, и вы можете выбрать в зависимости от ваших требований.
Преимущества
Вы обходите любые сценарии превышения, когда пользователь принадлежит ко многим группам, поэтому токен доступа не предоставляет вам всю необходимую информацию о группе.
Вам не нужно принудительно выходить из системы и снова входить в систему для пользователя, чтобы получить токен доступа со свежей информацией.
Детали сценария Overage для заявки groups
в токене доступа
В настоящее время вы, возможно, отредактировали манифест своего приложения и установили для свойства "groupMembershipClaims"
значение "All"
или "SecurityGroup"
, чтобы токен доступа получал groups
утверждение со всеми идентификаторами групп, к которым принадлежит пользователь.
Чтобы размер токена не превышал предельный размер заголовка HTTP, Azure AD ограничивает количество идентификаторов объектов, которые он включает в утверждение групп.. Если пользователь является членом большего числа групп, чем установлен предел превышения (150 для токенов SAML, 200 для токенов JWT), то Azure AD не выдает утверждение групп в токене. Вместо этого он включает в токен требование превышения, которое указывает приложению запрашивать Graph API для получения членства пользователя в группе.
хорошо понял.. другой подход может состоять в том, чтобы использовать обновить токен для получения нового токен доступа без повторного запроса учетных данных пользователя. Я думаю, что утверждения группы/роли должны быть обновлены в новом токене доступа, но не проверял это. об этом здесь docs.microsoft.com/en-us/azure/active-directory/develop/… .. Хотя этот подход может быть немного более хрупким, поскольку токены обновления могут быть отозваны по нескольким причинам.. также в случае групповых претензий сценарии превышения не будут решаться в этом подходе.. Удачи с вашей демонстрацией !
Спасибо, Рохит, ценю ваши последующие действия и подробный ответ.
Рохит, у вас есть идеи по реализации AquireTokenSilently() в .netcore? stackoverflow.com/questions/57134759/…
Спасибо, Рохит (Рохит Сайгал), на самом деле я создавал демоверсию для образца заявок на роли AD WebApp (azure.microsoft.com/en-us/resources/samples/…). Пока все работает нормально, когда я перемещаю пользователя из GroupA в GroupB. Мне нужно выйти из приложения и снова войти, чтобы проверить изменения. Мне нравится ваш подход к реализации, так как за 8 часов до моей демонстрации я думал, есть ли здесь выход без входа/выхода из системы. Спасибо!