Как получить роли администратора, членом которых я являюсь, из 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);
Другие вопросы по тегам