#azure #azure-active-directory #microsoft-graph-api
Вопрос:
Я пытаюсь запросить график, чтобы получить всех пользователей в моем клиенте, который имеет доступ к определенному ресурсу (т. Е. к моему веб-приложению) и выполняет определенную роль
Это то, что я получил до сих пор:
https://graph.microsoft.com/v1.0/users?$select=id,givenName,surname,mail,preferredLanguage,externalUserStateamp;$expand=appRoleAssignments($filter=resourceId eq ${resourceId} AND appRoleId eq ${appRole})
Как вы можете видеть:
- Я получаю всех своих пользователей
- Я расширяю список своих пользователей,
appRoleAssignments
которые должны предоставить мне назначения приложений для каждого пользователя и конкретные сведения для этого назначения - Я применяю фильтр для фильтрации объекта на основе соответственно
resourceId
ИappRoleId
Вызов работает, но мне возвращается каждый пользователь в моем арендаторе, что определенно не то, что я хочу — предпочтительно, я хотел бы, чтобы возвращались только те пользователи, которые имеют доступ ко мне resourceId
и которым присвоен определенный appRoleId
Ответ №1:
Это невозможно с помощью Graph API.
Например , если я хочу получить пользователей на основе идентификатора лицензии , вы можете использовать приведенный ниже API :
https://graph.microsoft.com/v1.0/users?$count=trueamp;$filter=assignedLicenses/any(s:s/skuId eq b05e124f-xxxx-xxxx-xxxx-8xxxxxxx)
И он предоставляет выходные данные, поскольку Назначенные лицензии являются частью одного и того же запроса Odata .
Но если вы попытаетесь сделать то же самое для назначений ролей приложений , это приведет к следующим ошибкам:
Поскольку Контекст пользователя и Контекст утверждений находятся в разных контекстах Odata. Итак , когда вы вызываете запрос :
https://graph.microsoft.com/v1.0/users?$select=id,givenName,surname,mail,preferredLanguage,externalUserStateamp;$expand=appRoleAssignments($filter=resourceId eq ${resourceId} AND appRoleId eq ${appRole})
Первая часть до расширения выполняется успешно и возвращает значение, но вторая часть, т. е. фильтр назначений ролей приложений, не работает, поэтому вы получаете список всех пользователей.
В качестве решения вы можете использовать сценарий PowerShell для того же самого ,используя условные параметры:
Connect-AzureAD
$users=Get-AzureADUser
$Name=@()
foreach ($user in $users) {
$approle=Get-AzureADUserAppRoleAssignment -ObjectId $user.ObjectId
$resourceId= 'a19d7xx-xxxx-xxxx-xxx-c48c4d991411'
if ($approle.ResourceId -eq $resourceId){
$deviceprops = [ordered] @{
UserDisplayName = $approle.PrincipalDisplayName
}
$deviceobj = new-object -Type PSObject -Property $deviceprops
$Name = $deviceobj
}
}
$Name
Выход:
Ссылка:
Get-AzureADUser и Получить-AzureADUserAppRoleAssignment и Установите модуль AzureAD