Как получить роли администратора, членом которых я являюсь, из Microsoft Graph с помощью.Net Client SDK?
Я знаю, как получить фильтрацию ролей в каталогах по типу, используя следующий запрос:
https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.directoryRole
Таким образом, ответ от MS Graph API содержит только directoryRole
объекты. Не уверен, как это можно сделать с помощью клиентского SDK MS Graph. Net, поскольку мы не указываем ни одно ключевое слово OData, например Select
или же Filter
в актуальном запросе на отдых.
Обратите внимание, что я не хочу звонить просто memberOf
и фильтр directoryRole
введите ответы в памяти на стороне клиента, я хочу, чтобы этот фильтр был частью запроса, как в приведенном выше URL, поэтому memberOf
ответ содержит только directoryRole
s.
2 ответа
В SDK фильтрация - это функция, применяемая к объекту. Например:
var users = await graphClient
.Users
.Request()
.Filter("startswith(displayName,'A')")
.GetAsync();
К сожалению, это не поможет вам здесь, так как /memberOf
не поддерживает $filter
, Поэтому вам необходимо выполнить фильтрацию на клиенте.
Если вы проверяете конкретный directoryRole
Вы можете прийти к этому с другой стороны. /members
конечная точка поддерживает фильтрацию по элементу id
:
v1.0/directoryRoles/{role-id}/members?$filter=id eq '{user-id}'
Здесь важно отметить, что /members
не поддерживает фильтрацию по userPrincipalName
только фактическим id
,
Клиент Graph Net не поддерживает ваши требования напрямую.
Но, основываясь на моем тесте, мы можем попробовать следующую работу:
Используйте следующий код, чтобы получить список с DirectoryRole, а затем отфильтровать по DisplayName, а затем проверить идентификатор шаблона роли. (Для directoryRole из Me.MemberOf, если DisplayName содержит Administrator, в основном, мы являемся ролью администратора. Если мы используем API DirectoryRoles мы можем перебрать список и проверить идентификатор шаблона роли):
// This will contains the group too, we need to filter it to get the directoryrole
IUserMemberOfCollectionWithReferencesRequest builder = graphClient.Me.MemberOf.Request();
IUserMemberOfCollectionWithReferencesPage page = await builder.GetAsync();
// This is all directoryrole in our tenant, we need to filter by DisplayName contains **Administrator**
IGraphServiceDirectoryRolesCollectionRequest request = graphClient.DirectoryRoles.Request();
IGraphServiceDirectoryRolesCollectionPage directoryRoles = await request.GetAsync();
Результаты Me.MemberOf: Результаты DirectoryRoles:
Если обходной путь по-прежнему не может удовлетворить ваши требования, я предлагаю вам отправить запрос на добавление функции uservoice и github.
Дополнительный ответ: (К сожалению, фильтрация ресурсов каталогов в Microsoft Graph, как правило, довольно ограничена. Поэтому вы можете просто использовать клиентский фильтр в памяти или отправить запрос функции сейчас):
Теоретически мы можем использовать остальные API, как это (указанный фильтр для запроса свойства ссылки в настоящее время не поддерживается.)
https://graph.microsoft.com/v1.0/me/memberOf/$/microsoft.graph.group?$filter=groupTypes/any(a:roleTemplateId eq '62e90394-69f5-4237-9190-012177145e10')
И в коде C#, который основан на Graph Client
List<QueryOption> options = new List<QueryOption>
{
new QueryOption("$filter",
"groupTypes/any(a:roleTemplateId eq '62e90394-69f5-4237-9190-012177145e10'")
};
IUserMemberOfCollectionWithReferencesRequest builder = graphClient.Me.MemberOf.Request(options);
IGraphServiceDirectoryRolesCollectionRequest request = graphClient.DirectoryRoles.Request(options);