在 Azure AD 图形帮助程序中获取成员组

本文关键字:获取 成员 帮助程序 Azure AD 图形 | 更新日期: 2023-09-27 18:31:04

我使用Graph API查询我的Azure Active Directory,使用Microsoft.WindowsAzure.ActiveDirectory.GraphHelper项目作为我请求的基础。

在一个特定的用例中,我有一个包含数百个用户的组,以及几个组。我希望加载此父组的组成员。我试图请求加载members属性:

DirectoryService.LoadProperty(school, "members");
我只得到 100 个

结果,都是用户(同样,组中有 100 多个用户)。
我尝试执行DataServiceQuery但它不支持这样的操作:

var groups = DirectoryService.groups;
Group parentGroup = DirectoryService.groups.Where(it => (it.objectId == parentGroupId)).SingleOrDefault();
groups = (DataServiceQuery<Group>)groups.Where(group => group.memberOf.Contains(parentGroup));

它在第三行失败,表示不支持该表达式。

目前,我能想到的唯一解决方案是加载所有组,在每个组上运行LoadPropert(entity, 'memberOf', null),然后检查每个组是否是父组的成员(实际上是几个这样的父组之一)。 注意 - 我把null放在continuationToken空间中,因为这些组应该只是一个父组的成员。

这是非常低效的,但我似乎找不到任何其他方法!
有没有其他方法可以做我想做的事情?

在 Azure AD 图形帮助程序中获取成员组

AAD 图形 API 当前每页返回 100 个项目。如果您发出的请求是针对多页数据,则响应将包含指向下一页数据的链接。从 Azure AD 图形 API 中支持的查询、筛选器和分页选项:

包含分页结果的响应将包含一个跳过令牌 (odata.nextLink),该令牌允许您获取下一页结果。

查看此情况的最简单方法是以要 https://graphexplorer.cloudpp.net 的目录的用户身份登录。然后,执行简单的GET

https://graph.windows.net/<your.domain.name>/users

由于您的用户超过 100 个,因此如果您向下滚动到结果底部,您将看到一个属性odata.nextLink。如果复制该属性的内容,并在下一个查询中使用,则将获得下一页。继续此示例,下一个请求将如下所示:

https://graph.windows.net/<your.domain.name>/directoryObjects/$/Microsoft.WindowsAzure.ActiveDirectory.User?$skiptoken=X'4453...

我注意到您正在使用已弃用的帮助程序库Microsoft.WindowsAzure.ActiveDirectory.GraphHelper.相反,应使用较新(且受支持的)图形 API 客户端库:Microsoft.Azure.ActiveDirectory.GraphClient (NuGet)。以下代码段检索所有组成员,并且仅打印组对象的显示名称:

// Fetch group member objects
IGroupFetcher groupFetcher = (IGroupFetcher)parentGroup;
IPagedCollection<IDirectoryObject> members = 
    groupFetcher.Members.ExecuteAsync().Result;
// Iterate over each page keep only the Groups
do
{
    List<IDirectoryObject> directoryObjects = members.CurrentPage.ToList();
    foreach (IDirectoryObject member in directoryObjects)
    {
        if (member is Group)
        {
            Group group = member as Group;
            Console.WriteLine("Group: {0}", group.DisplayName);
        }
    }
    members = members.MorePagesAvailable ? 
        members = members.GetNextPageAsync().Result : null;
} while (members != null);

请在 github 上查看我们的最新示例。 示例:https://github.com/AzureADSamples/ConsoleApp-GraphAPI-DotNet 通过最新的图形客户端库对图形 API 进行了许多示例调用,包括获取组成员身份(如上所示)