Как получить имена групп пользователя, являющегося участником, используя Microsoft Graph API?

#c# #azure #azure-active-directory #microsoft-graph-api #asp.net-core-webapi

#c# #azure #azure-active-directory #microsoft-graph-api #asp.net-core-webapi

Вопрос:

Я хочу знать список групп, членом которых является пользователь, в AAD. На основе членства в группе они могут выполнять другую функцию. Для достижения этой цели я использовал MS Graph API, но я получаю только идентификаторы групп, а не имена групп. Я использовал следующие два способа, используя graph API. Первый используемый метод,

 await  graphClient.Users[upn].GetMemberGroups(false).Request().PostAsync()
  

ответ:

 [ "fee2c45b-915a-4a64-b130-f4eb9e75525e", "4fe90ae7-065a-478b-9400-e0a0e1cbd540", "e0c3beaf-eeb4-43d8-abc5-94f037a65697" ]
  

Второй используемый метод,

 await  graphClient.Users[upn].MemberOf.Request().GetAsync();
  

ответ:

 [
    {
        "deletedDateTime": null,
        "id": "1c4934554-5006-403a-bf4f-bsdfeerwfs6fe6f",
        "oDataType": "#microsoft.graph.group",
        "additionalData": {
            "creationOptions": [],
            "isAssignableToRole": null,
            "resourceBehaviorOptions": [],
            "resourceProvisioningOptions": []
        }
    },
    {
        "deletedDateTime": null,
        "id": "f8975c2f-7651d-4f3a-1234-4ec3808a0ac2",
        "oDataType": "#microsoft.graph.group",
        "additionalData": {
            "creationOptions": [
                []
            ],
            "isAssignableToRole": null,
            "resourceBehaviorOptions": [],
            "resourceProvisioningOptions": [
                []
            ]
        }
    }
]
  

Что мне нужно, так это имя группы и идентификатор группы. Как мне объединить оба эффективным способом? Или есть какой-либо другой метод, который я могу попробовать для этой цели?

Ответ №1:

Для меня следующее работает для получения имен групп:

 var page = await graphClient
    .Users[userObjectId]
    .MemberOf
    .Request()
    .GetAsync();

var names = new List<string>();
names.AddRange(page
        .OfType<Group>()
        .Select(x => x.DisplayName)
        .Where(name => !string.IsNullOrEmpty(name)));
while (page.NextPageRequest != null)
{
    page = await page.NextPageRequest.GetAsync();
    names.AddRange(page
        .OfType<Group>()
        .Select(x => x.DisplayName)
        .Where(name => !string.IsNullOrEmpty(name)));
}

return names;
  

В ответе для групп должно быть DisplayName / имя_дисПлея.

Комментарии:

1. Код должен возвращать имена, а не groupNames. Мои значения DisplayName равны нулю, несмотря на то, что идентификаторы верны для ожидаемых групп.

2. Исправление: мне пришлось добавить Directory.Read. Все разрешения для моей регистрации в приложении B2C. Теперь я получаю возвращенное DisplayName.