Azure AD: Как сделать так, чтобы токены имели претензию "hasgroups"?
Наше приложение позволяет назначать разрешения для групп, что означает, что для каждого пользователя мы должны надежно определять членство в группах. Пользователь представляет токен, регулярно получаемый с помощью ADAL (некоторые используют.NET, другие используют NodeJS, другие используют CLI).
Некоторые пользователи, похоже, отправляют токен со следующим утверждением:
"hasgroups": true,
Это утверждение задокументировано на странице справки по токену Azure AD.
Мы хотели бы добавить тестовый пример для этого, но после следующих шагов здесь и здесь мы всегда получаем токен со следующими утверждениями:
"_claim_names": {
"groups": "src1"
},
"_claim_sources": {
"src1": {
"endpoint": "https://graph.windows.net/{redacted}/users/{redacted}/getMemberObjects"
}
},
Что не так с нашей настройкой? Почему мы не можем получить hasgroups
Запрос?
Вот некоторая дополнительная информация:
- Тип приложения Native (не WebApi).
- Манифест говорит
"oauth2AllowImplicitFlow": true
, - Приложению предоставляется доступ к хранилищу ключей Azure.
Мы используем следующий код для получения токена (в C#):
var userCredential = new UserCredential( _userName, _password );
result = context.AcquireToken( _resource, _clientId, userCredential );
Куда:
_userName
а также_password
от пользователя с большим количеством групп._clientId
это идентификатор приложения нативного приложения - с"oauth2AllowImplicitFlow": true
,_resource
являетсяhttps://vault.azure.net
,
Токен выдан правильно. Единственная проблема заключается в том, что он показывает _claim_names
а также _claims_sources
вместо hasgroups
,
1 ответ
Где: • _userName и _password от пользователя с большим количеством групп.
Поскольку пользователь является частью большого количества групп (при условии, что здесь 6 или более). Токен Azure AD вернется с индикатором превышения групп вместо фактических идентификаторов групп в заявке "группы". Я думаю, вы знаете это и, следовательно, делаете это намеренно.
var userCredential = new UserCredential( _userName, _password ); result = context.AcquireToken( _resource, _clientId, userCredential );
Так как вы получаете токен в приложении на основе.NET с использованием кода C#, ответ токена не ограничен по длине (как в случае с веб-SPA, где он возвращается как фрагмент URI, а длина URL-адреса имеет ограничения)
Просматривая документацию, утверждения "hasgroups" и "groups:src1" имеют одно и то же намерение сказать, что существует слишком много групп для возврата в качестве части токена. Хотя есть небольшая разница
в тех случаях, когда применяется ограничение URL, "hasgroups" будет отправлено как true (как неявный поток предоставления для SPA)
в случаях, когда длина не ограничена (как в вашем случае), Azure AD по-прежнему не будет возвращать все группы, чтобы убедиться, что токен не становится слишком большим, но отправит немного больше информации о том, как добраться до всех групп отправив информацию о том, как вы можете сделать запрос для всех ваших групп. В этом случае он отправляет "groups:src1" и "_claim_sources" с информацией об источнике, а не только "hasgroups"