У нас есть одностраничное приложение Javascript, которое выполняет вызовы Microsoft Graph API с использованием делегированных разрешений.
Он также получает список пользователей через конечную точку / users.
Теперь, когда URL-адрес запроса был https://graph.microsoft.com/v1.0/users?$select=id,displayName,givenName,surname,mail,userPrincipalName
,
все работало нормально.
Но затем мы изменили его, чтобы включить фильтр.
В частности, мы хотим только гостей.
Поэтому мы изменили URL запроса на https://graph.microsoft.com/v1.0/users?$filter=userType eq 'Guest'&$select=id,displayName,givenName,surname,mail,userPrincipalName,userType
.
Теперь некоторые пользователи получают 403 Запрещено, когда мы пытаемся сделать запрос.
Что удивительно, так это то, что они могут получить полный список пользователей, но не могут получить подмножество пользователей.
Этот пользователь сам является гостем и имеет роль каталога Guest Inviter.
Это дает им возможность читать всех пользователей.
У меня есть учетная запись Global Admin, которая также может использовать второй запрос (было бы довольно ошеломляющим, если бы не мог).
Само приложение имеет необходимые области, поскольку оно может читать пользователей, оно зависит только от пользователя и его прав доступа в AAD.
Моя теория состоит в том, что у пользователя нет разрешения на доступ к свойству userType
, и это вызывает 403.
Вероятно, это часть "полного профиля".
Филипп подтвердил это, заявив, что вы не можете получить доступ к этому свойству через область User.ReadBasic.All.
Если мы посмотрим на разрешения роли приглашенного гостя: https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#guest-inviter.
Мы видим, что у них есть microsoft.aad.directory/users/basic/read
, с другой стороны, глобальный администратор имеет microsoft.aad.directory/users/allProperties/allTasks
.
Мой вопрос: что мне нужно сделать, чтобы включить этот запрос для пользователя?
В этом случае я хотел бы не предоставлять им Global Admin.
Токен приложения имеет следующие области действия:
- Directory.AccessAsUser.All
- User.Read
Ранее мы использовали менее привилегированную область видимости,
но нам нужно было добавить функции, требующие более высоких привилегий.
Область, которую мы имеем, является «наиболее привилегированной» областью для перечисления пользователей: https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/user_list.
Приложение также зарегистрировано как приложение Native, если это имеет значение.
Выход и повторный вход (для обновления токена) также не помогают.
Эта проблема возникает при новом входе в систему с теми же областями действия в токене.
Единственное отличие - это роль пользователя в AAD.
Идентификатор запроса: 6079bcb2-6f90-44cc-8a57-83a8e1676333, отметка времени чт, 15 ноября 2018 г. 06:49:59 GMT.