我使用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
空间中,因为这些组应该只是一个父组的成员。
这非常低效,但我似乎无法找到其他任何方式! 还有另一种方法可以做我想做的事吗?
答案 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.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);
答案 1 :(得分:2)
请在github上查看我们的最新样本。示例:https://github.com/AzureADSamples/ConsoleApp-GraphAPI-DotNet通过最新的图形客户端库对图API进行了许多示例调用,包括获取组成员资格(如上面的Philippe所示)