Microsoft Graph API 分页无法从 Azure AD 获取所有用户

Microsoft Graph API Pagination is not working for getting all users from Azure AD

我们正在使用 Microsoft Graph API 测试版 使用以下代码从 Azure AD 检索所有用户。 API return 只有 100 个用户在响应中使用我们尝试过的分页响应 NextPageRequest 属性。但它总是returnnullNextPageRequest属性。因此,它永远不会进入 while 循环以检索其余用户。

测试版 SDK 版本:4.0.1.0

代码:

                List<User> usersList = new List<User>();
                IGraphServiceUsersCollectionPage users = await graphClient.Users.Request().GetAsync();

                // Add the first page of results to the user list
                usersList.AddRange(users.CurrentPage);

                // Fetch each page and add those results to the list
                while (users.NextPageRequest != null)
                {
                    users = await users.NextPageRequest.GetAsync();
                    usersList.AddRange(users.CurrentPage);
                }

                log.Info("Users count: " + usersList.Count.ToString());
                return usersList;

我关注的参考链接:

如有任何帮助,我们将不胜感激!

下面的代码对我来说工作得很好。

public static async Task<List<User>> getUsers()
        {
            List<User> usersList = new List<User>();
            graphClient.BaseUrl = "https://graph.microsoft.com/beta";
            IGraphServiceUsersCollectionPage users = await graphClient.Users
                .Request()
                .GetAsync();

            usersList.AddRange(users.CurrentPage);

            while (users.NextPageRequest != null)
            {
                users = await users.NextPageRequest.GetAsync();
                usersList.AddRange(users.CurrentPage);
            }
            return usersList;
        }

在 Azure Active Directory 用户 Blade 中检查您的用户,看看其中有多少用户。如果用户数量超过 100,您还可以通过简单地使用 $top 查询参数扩展代码来测试用户数量,该参数为每个请求提供 998 条记录,如下所示。

IGraphServiceUsersCollectionPage users = await graphClient.Users
                    .Request()
                    .Top(998)
                    .GetAsync();

您还可以在 Graph Explorer.

中测试 Graph API 调用

编辑:

经过长时间的研究,我发现它是 Microsoft Graph Beta SDK 中的一个错误,因为它总是在 NextPageRequest 中发送 null。但这里有趣的是,它在 AdditionalData 属性 中发送 odata.nextLink。因此,如果您使用的是 Graph Beat SDK,请使用以下代码。

public static async Task<List<User>> getUsers()
        {
            List<User> usersList = new List<User>();
            IGraphServiceUsersCollectionPage users = await graphClient.Users
                .Request()
                .GetAsync();

            usersList.AddRange(users.CurrentPage);
            try
            {
                while (users.AdditionalData["@odata.nextLink"].ToString() != null)
                {
                    users.InitializeNextPageRequest(graphClient, users.AdditionalData["@odata.nextLink"].ToString());
                    users = await users.NextPageRequest.GetAsync();
                    usersList.AddRange(users.CurrentPage);
                }
            }
            catch(Exception e)
            {
                
            }
            return usersList;
        }

注意: Microsoft 不建议在生产中使用其 Graph Beta version,因为它们可能会发生变化。

我正在添加以下代码,以便它可以帮助 java 开发人员解决这个问题。

这不是对该主题的回答,而是针对 java 用户的回答。

graphServiceClient = graphConnection.getGraphConnection();
List<User> users = new ArrayList<>();
UserCollectionPage usersPage = graphServiceClient.users().buildRequest().select(COLUMN_NAMES)
    .expand("manager($select=id,givenName,mail,userPrincipalName)").get();

while (usersPage != null) {
  final List<User> currentPageUsers = usersPage.getCurrentPage();
  users.addAll(currentPageUsers);
  UserCollectionRequestBuilder nextPage = usersPage.getNextPage();
  if (nextPage == null) {
    break;
  } else {
    usersPage = nextPage.buildRequest().get();
  }
}

return users;

这是工作代码。我已经测试了 200 个用户。允许的最大页面大小为 100。我尝试了 top(999),它每页最多只能获取 100。