编程语言
首页 > 编程语言> > c# – 通过Microsoft Graph从Azure AD获取组中的用户

c# – 通过Microsoft Graph从Azure AD获取组中的用户

作者:互联网

我正在通过Microsoft Graph从AzureAD请求用户列表.

我得到了User对象,但它们的MemberOf属性始终为null.

我以为我可以使用Expand来专门请求该属性,虽然它不会导致错误,但它也不会填充属性.

这个question and answer from mid-2016表明当时这个功能处于测试阶段,我认为它现在已经毕业于生产API了吗?

var allUsers = await graphClient
    .Users
    .Request()
    .Expand("memberOf")
    .GetAsync();

var usersInGroup = allUsers
    .Where(user => user.MemberOf.Any(memberOf => memberOf.Id.Equals(groupId, StringComparison.OrdinalIgnoreCase)))
    .ToList();

(我试过扩展“memberOf”和“MemberOf”.)

我可以通过该组检索成员列表.

但是这会返回一个ID列表,所以我必须提出两个请求而不是一个请求.

var groupMembers = await graphClient
    .Groups[groupId]
    .Members
    .Request()
    .GetAsync();

var groupMemberIds = groupMembers
    .Select(groupMember => groupMember.Id)
    .ToList();

var allUsers = await graphClient
    .Users
    .Request()
    .GetAsync();

var usersInGroup = allUsers
    .Where(user => groupMemberIds.Contains(user.Id))
    .ToList();

如果获取属于该组的ID,然后过滤用户是正确的方式,那么没关系,我将继续.

理想情况下,我想发出一个请求来检索User对象并在服务器端完成过滤.

例如

var usersInGroup = await graphClient
    .Users
    .Request()
    .Filter($"memberOf eq {groupId}")
    .GetAsync();

显然过滤器不起作用,但类似的东西是理想的.

(有人指出我一直在链接到错误的文档集,因此我删除了这些链接以防止未来读者混淆)

解决方法:

获取单个组的成员资格可以使用$expand完成.例如,在Graph Explorer中运行以下查询将返回Group HRTaskforce及其所有成员:

https://graph.microsoft.com/v1.0/groups/02bd9fd6-8f93-4758-87c3-1fb73740a315?$expand=members

使用.NET Client SDK,您可以执行以下操作:

var  groupAndMembers = await _tokenService.Token.GetGraphServiceClient()
    .Groups["02bd9fd6-8f93-4758-87c3-1fb73740a315"]
    .Request()
    .Expand("members")
    .GetAsync();

var usersInGroup = groupAndMembers.Members.ToList();

另外,您链接到的所有文档都来自Azure AD Graph API.请注意,这是一个不同的API,并且假设Azure AD Graph中的资源和方法可用(或工作方式与Microsoft Graph相同)并不总是安全的

标签:c,microsoft-graph
来源: https://codeday.me/bug/20190627/1304994.html