获取Azure AD Graph Helper中的成员组

Guy*_*ssy 6 c# azure-active-directory

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

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

DirectoryService.LoadProperty(school, "members");
Run Code Online (Sandbox Code Playgroud)

我只得到100个结果,所有这些都是用户(同样,该组中有超过100个用户).
我尝试执行a 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));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Phi*_*ret 14

AAD Graph API目前每页返回100个项目.如果您提出的请求是针对多页数据,则响应将包含指向下一页数据的链接.来自Azure AD Graph API中的支持的查询,过滤器和分页选项:

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

最简单的方法是以https://graphexplorer.cloudpp.net的目录用户身份登录.然后,做到这一点GET:

https://graph.windows.net/<your.domain.name>/users
Run Code Online (Sandbox Code Playgroud)

由于您有超过100个用户,如果向下滚动到结果的底部,您将看到一个属性odata.nextLink.如果您复制该属性的内容,然后在下一个查询中使用,那么您将获得下一页.继续这个例子,下一个请求看起来像这样:

https://graph.windows.net/<your.domain.name>/directoryObjects/$/Microsoft.WindowsAzure.ActiveDirectory.User?$skiptoken=X'4453...
Run Code Online (Sandbox Code Playgroud)

我注意到你正在使用已弃用的帮助程序库Microsoft.WindowsAzure.ActiveDirectory.GraphHelper.相反,您应该使用更新(和支持)的Graph 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);
Run Code Online (Sandbox Code Playgroud)