如何在单个 Get 命令中使用 Microsoft Graph SDK 获取所有组成员的开放扩展属性

问题描述 投票:0回答:1

在 Azure Active Directory 中,在 Azure AD 中创建用户时,我使用 OpenTypeExtension 为每个用户添加 Extention

数据

下面是用于在 Azure AD 中创建新用户时向每个用户添加 Extention 数据的代码段。 在这里,我为每个用户添加了三个Extension属性,即(

acsid
defaultgroupid
useryominame

var openTypeExtension = new OpenTypeExtension();
                openTypeExtension.ExtensionName = "com.mysite.user.extprofile";
                openTypeExtension.AdditionalData = new Dictionary<string, object>();
                openTypeExtension.AdditionalData.Add("acsid", "8:acs:0e9c3151-234r-4e5b-3245-37ffaa4d79ab_00000017-2erf-75bc-8876-c93a0d00abcd");
                openTypeExtension.AdditionalData.Add("defaultgroupid", "347e12e4-9cf1-437b-f4r5-6dcc7452234d");
                openTypeExtension.AdditionalData.Add("useryominame", "myyominame");

var extensionresult = await _graphClient.Users[user.Id].Extensions["com.mysite.user.extprofile"].Request().GetAsync();

现在,一旦创建了用户,相应的扩展属性(

acsid
defaultgroupid
useryominame
)也被添加到 Azure AD 中的用户。

但是,当我尝试使用 Microsoft Graph SDK 获取 all Group 成员时,用户/成员列表不会返回“extensions”属性(

acsid
defaultgroupid
useryominame
)。

以下是获取群组成员的代码片段。

GraphServiceClient graphClient = await GetGraphClient()
                    .ConfigureAwait(false);

                var groupMembers = await graphClient.Groups[id].Members
                    .Request()
                    .GetAsync()
                    .ConfigureAwait(false);

                var usersInGroup = groupMembers.OfType<User>().ToList();

在上面的代码片段中变量

usersInGroup 
不包含扩展属性(
acsid
defaultgroupid
useryominame

所以,在获得

usersInGroup 
列表后,我不得不从列表中迭代每个用户,然后获取 Extension 属性。

下面是我使用 for 循环遍历每个用户然后获取每个用户的 Extensions 属性的代码。

注意:在这里,我使用

Parallel.ForEach
而不是简单的
foreach
来优化我的响应时间。

Parallel.ForEach(usersInGroup, user =>
                {
                    var userWithExtensions = graphClient.Users[user.Id].Extensions["com.mysite.user.extprofile"].Request().GetAsync();
                    user.AdditionalData = userWithExtensions?.Result.AdditionalData;
                }
                );

我在想,如果 Microsoft Graph SDK 提供任何选项,我们可以在获取组成员的同时直接获取扩展。

azure-active-directory microsoft-graph-api azure-ad-b2c
1个回答
0
投票

extensions
user
资源类型的导航属性。

您可以使用 OData cast 仅获取用户成员资格列表并包含扩展

GET https://graph.microsoft.com/v1.0/groups/{groupId}/members/microsoft.graph.user?$expand=extensions

在 C# SDK v4 中编写上面的查询

// append OData cast microsoft.graph.user to groups/{id}/members url
var url = graphClient.Groups[id].Members.AppendSegmentToRequestUrl("microsoft.graph.user");

// create a new instance of GroupMembersCollectionWithReferencesRequestBuilder
var groupMembersBuilder = new GroupMembersCollectionWithReferencesRequestBuilder(url, graphClient);

// expand extensions and get result
var groupMembers = await groupMembersBuilder
                .Request()
                .Expand("extensions")
                .GetAsync();

foreach (var member in groupMembers)
{
    if (member is User user)
    {
        // user.Extensions
    }
}

对于 SDK v5

var response = await graphClient.Groups[id].Members.GraphUser.GetAsync(x =>
    {
        x.QueryParameters.Expand = new[] { "extensions" };
    });
var users = response.Value;
© www.soinside.com 2019 - 2024. All rights reserved.