如何通过Microsoft Graph SDK单次获取所有组成员的Open Extensions属性
问题
在Azure Active Directory(Azure AD)中,我创建用户时会使用OpenTypeExtension为每个用户添加扩展数据,具体添加了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();
用户创建完成后,扩展属性已成功添加到Azure AD的用户对象中。但当我使用Microsoft Graph SDK获取组内所有成员时,返回的用户列表不包含这些扩展属性,获取组成员的代码如下:
GraphServiceClient graphClient = await GetGraphClient() .ConfigureAwait(false); var groupMembers = await graphClient.Groups[id].Members .Request() .GetAsync() .ConfigureAwait(false); var usersInGroup = groupMembers.OfType<User>().ToList();
目前我只能通过遍历每个用户,调用接口获取其扩展属性(使用Parallel.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是否支持在获取组成员的同时直接获取这些Open Extensions属性?
回答
可以直接在获取组成员时一并拉取Open Extensions属性,无需逐个用户调用接口,核心是使用**$expand查询参数**指定要加载的扩展名称。
具体实现
- 在请求组成员时,通过
Expand方法指定要扩展的目标OpenTypeExtension,格式为extensions('{extensionName}') - 由于组成员可能包含非用户类型(如设备、联系人),需过滤出
User类型对象,扩展属性会被加载到User的Extensions集合中
修改后的代码示例
GraphServiceClient graphClient = await GetGraphClient().ConfigureAwait(false); // 通过$expand拉取指定的扩展属性 var groupMembers = await graphClient.Groups[id].Members .Request() .Expand("extensions('com.mysite.user.extprofile')") // 关键:扩展指定的OpenTypeExtension .GetAsync() .ConfigureAwait(false); var usersInGroup = groupMembers.OfType<User>().ToList(); // 从User对象的Extensions集合中提取扩展数据 foreach (var user in usersInGroup) { var extProfile = user.Extensions.FirstOrDefault(e => e.Id == "com.mysite.user.extprofile") as OpenTypeExtension; if (extProfile != null) { user.AdditionalData = extProfile.AdditionalData; } }
注意事项
- 必须指定具体的扩展名称,不能仅写
extensions(否则会返回所有扩展,性能不如精准指定) - 确保应用拥有
User.Read.All或足够权限读取用户扩展属性 - 若组成员数量较多,建议配合
$top参数分页获取,避免单次请求数据量过大
内容的提问来源于stack exchange,提问作者Azhar
相关产品推荐
相关产品推荐

