使用.NET Core 7获取Azure AD全部用户遇分页限制仅返回100条
解决Azure AD获取全部用户的分页问题
问题原因
Microsoft Graph API 默认采用分页机制,单次请求最多返回100条用户记录。当用户总数超过100时,响应中会包含@odata.nextLink字段,指向后续分页的请求地址,必须通过迭代请求才能获取所有数据。
解决方案1:手动处理分页
通过循环检查响应中的分页链接,持续请求直到获取全部数据:
var scopes = new string[] { "https://graph.microsoft.com/.default" }; var confidentialClient = ConfidentialClientApplicationBuilder .Create(ClientId) .WithAuthority($"https://login.microsoftonline.com/{TenantId}/v2.0") .WithClientSecret(ClientSecret) .Build(); GraphServiceClient graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => { var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync(); requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); })); var allUsers = new List<User>(); var usersPage = await graphServiceClient.Users.Request().GetAsync(); // 添加第一页数据 allUsers.AddRange(usersPage.CurrentPage); // 循环获取后续分页数据 while (usersPage.NextPageRequest != null) { usersPage = await usersPage.NextPageRequest.GetAsync(); allUsers.AddRange(usersPage.CurrentPage); } // allUsers 集合已包含所有用户记录
解决方案2:使用PageIterator(推荐)
Microsoft Graph SDK提供了PageIterator类,可自动处理分页逻辑,代码更简洁:
var scopes = new string[] { "https://graph.microsoft.com/.default" }; var confidentialClient = ConfidentialClientApplicationBuilder .Create(ClientId) .WithAuthority($"https://login.microsoftonline.com/{TenantId}/v2.0") .WithClientSecret(ClientSecret) .Build(); GraphServiceClient graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => { var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync(); requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); })); var allUsers = new List<User>(); var usersRequest = graphServiceClient.Users.Request(); // 创建PageIterator并设置数据处理逻辑 var pageIterator = PageIterator<User>.CreatePageIterator( graphServiceClient, await usersRequest.GetAsync(), (user) => { allUsers.Add(user); return true; // 返回true表示继续迭代 } ); // 执行迭代获取全部数据 await pageIterator.IterateAsync(); // allUsers 集合已包含所有用户记录
额外优化:调整每页数量
若想减少请求次数,可通过Top()方法设置每页最大返回数(最大支持999条):
// 单次请求最多返回999条数据 var usersRequest = graphServiceClient.Users.Request().Top(999);
按照此设置,1500条用户仅需2次请求即可获取全部数据。
内容的提问来源于stack exchange,提问作者Yogesh Shinde
相关产品推荐
相关产品推荐

