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

Обратите внимание, что я не хочу вызывать только memberOf и фильтровать ответы типа directoryRole в памяти на стороне клиента, я хочу, чтобы этот фильтр был частью запроса, как в URL-адресе выше, поэтому ответ memberOf содержит только directoryRole s.


person Dogu Arslan    schedule 06.09.2018    source источник


Ответы (2)


В SDK фильтрация - это функция, применяемая к объекту. Например:

var users = await graphClient
    .Users
    .Request()
    .Filter("startswith(displayName,'A')")
    .GetAsync();

К сожалению, здесь это вам не поможет, поскольку /memberOf не поддерживает $filter. Таким образом, вам нужно будет выполнить фильтрацию на клиенте.

Если вы проверяете конкретный directoryRole , вы могли бы подойти к этому с другой стороны. Конечная точка /members < em> поддерживает фильтрацию по члену id:

v1.0/directoryRoles/{role-id}/members?$filter=id eq '{user-id}'

Здесь важно отметить, что /members не поддерживает фильтрацию по userPrincipalName, только по фактическому id.

person Marc LaFleur    schedule 07.09.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:  введите описание изображения здесь Результаты 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);
person Seiya Su    schedule 07.09.2018
comment
Есть ли другой способ отфильтровать конкретную роль каталога из ответа memberOf с помощью RoleTemplateId? - person Dogu Arslan; 07.09.2018
comment
Я думаю, что RoleTempateId можно использовать для фильтрации результата MemberOf и DirectoryRoles (итерация по списку или LINQ). Способ кроме RoleTemplateId еще нужно протестировать - person Seiya Su; 07.09.2018
comment
Если вы опубликуете рабочий пример фильтрации с помощью RoleTemplateId, я приму этот ответ. - person Dogu Arslan; 07.09.2018
comment
Сейчас наша суббота, я сделаю это в понедельник после возвращения в офис. - person Seiya Su; 07.09.2018
comment
Я должен вернуться в свой офис примерно через 20 часов, уже сегодня вечером. - person Seiya Su; 07.09.2018
comment
Спасибо, Сейя, мы не можем ждать до выходных. Чтобы уточнить, я не ищу фильтрацию памяти на стороне клиента. Я знаю, как это легко сделать. Я ищу способ продвинуть эту фильтрацию (то есть фильтровать по определенному RoleTemplateId) на стороне сервера. - person Dogu Arslan; 07.09.2018
comment
Что касается фильтра на стороне сервера, все, что я могу сказать, - это стараться изо всех сил. Как вы знаете, мы мало что можем сделать для кода на стороне сервера Graph. Наиболее вероятный результат, нам нужно сделать фильтр в памяти или отправить запрос функции - person Seiya Su; 07.09.2018