AAD группы утверждают, что отсутствуют в JWT-токене для некоторых пользователей

Я испытываю странное поведение на нашем AAD. После успешного входа в систему мы получаем несанкционированный доступ для некоторых пользователей по нашим вызовам API. Оказывается, что претензия в JWT отсутствует. Некоторые пользователи получают утверждение "groups" (массив всех идентификаторов групп, к которым он принадлежит), а некоторые получают утверждение "hasgroups" (логическое значение, если у пользователя есть группы, без идентификаторов). Поскольку наше приложение API проверяет эту заявку "группы" на предмет авторизации, пользователи, у которых нет этой заявки "группы", получают 403.

Тем не менее, в манифесте регистрации приложения я установил "groupMembershipClaims" с "null" на "All" или "SecurityGroup", что должно сделать оба трюка. Также установите для "oauth2AllowImplicitFlow" значение true, поскольку мы работаем с приложением Angular, которое использует OAuth2. Кроме того, я сравнил почти все настройки пользователей и, кроме некоторых дополнительных групп, пользователи идентичны: у затронутых пользователей не так много групп, а у некоторых даже максимум 5 групп.

Я что-то упускаю из виду или что вызывает эту разницу в претензиях? Как я могу решить эту проблему, чтобы все пользователи получали претензии "групп"?

2 ответа

Решение

Получил этот отзыв от внутренних органов MSFT:

В неявном потоке oauth будет возвращать Jwt непосредственно из вызова intial /authorize через параметр строки запроса. Спецификация http ограничивает длину строки / URL-адреса запроса, поэтому, если AAD обнаружит, что результирующий URI будет превышать эту длину, они заменяют группы утверждением hasGroups.

И это

Это предусмотрено при использовании неявного потока предоставления, независимо от параметра "groupMembershipClaims" в манифесте. Следует избегать превышения ограничения длины URL-адреса в браузере, поскольку токен возвращается как фрагмент URI. Таким образом, более или менее после членства в группах 4-х пользователей вы получите "hasgroups: true" в токене. Что вы можете сделать, это сделать отдельный вызов Graph API для запроса членства в группе пользователя.

Так что нужно будет сделать дополнительную поездку в Graph API, чтобы получить группы пользователей. Надеюсь, что это помогает другим.

Теперь это описано в ссылке на токен Azure AD по адресу https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims.

Для потока неявного предоставления OAuth2 он использует hasGroups токен и документация для этого токена:

Используется вместо groups заявка на JWT в неявных потоках предоставления, если заявка полной группы расширит фрагмент URI за пределы длины URL (в настоящее время 6 или более групп).

Для других потоков:

если число групп, в которых находится пользователь, превышает лимит (150 для SAML, 200 для JWT), то к заявке на превышение добавляются источники заявок, указывающие на конечную точку Graph, содержащую список групп для пользователя.

Вы можете использовать Graph API для получения групп пользователей, используя https://graph.windows.net/{tenantID}/users/{userID}/getMemberObjects,

В качестве альтернативы есть конечная точка в https://graph.windows.net/myorganization/isMemberOf?api-version как описано в https://msdn.microsoft.com/library/azure/ad/graph/api/functions-and-actions

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