Расширение MS-графика и последующая фильтрация для нескольких реквизитов не применяется фильтр

#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