Как получить роли администратора, членом которых я являюсь, из Microsoft Graph с помощью .Net Client SDK? - PullRequest
0 голосов
/ 06 сентября 2018

Я знаю, как получить фильтрацию ролей в каталогах членов по типу, используя следующий запрос:

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 с.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

В 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.

0 голосов
/ 07 сентября 2018

Клиент Graph Net не поддерживает ваши требования напрямую.

Но, основываясь на моем тесте, мы можем попробовать следующее:

Используйте следующий код, чтобы получить список с DirectoryRole, а затем выполнить фильтрацию по DisplayName, а затем проверить идентификатор шаблона роли (Для directoryRole из Me.MemberOf , если DisplayName содержит Администратор , по сути, мы роль администратора. Если использовать 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 : enter image description here Результаты DirectoryRoles : enter image description here

Если обходной путь все еще не может удовлетворить ваши требования, я предлагаю вам отправить запрос на добавление функций по uservoice и github Issues

Дополнительный ответ: (К сожалению, фильтрация в 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);
...