获取Azure AD Graph Helper中的成员组

时间:2014-11-20 10:20:09

标签: c# azure-active-directory

我使用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),然后检查每个组成员是否是其成员parentGroup(实际上是几个这样的parentGroup之一)。 注意 - 我将null放在continuationToken空间中,因为这些组应该只是一个父组的成员。

这非常低效,但我似乎无法找到其他任何方式! 还有另一种方法可以做我想做的事吗?

2 个答案:

答案 0 :(得分:14)

AAD Graph API目前每页返回100个项目。如果您提出的请求是针对多页数据,则响应将包含指向下一页数据的链接。来自Supported Queries, Filters, and Paging Options in Azure AD Graph 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...

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

// 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);

答案 1 :(得分:2)

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