使用Amazon.AspNetCore.Identity.Cognito时GetUsersInRoleAsync仅返回25条结果的问题
问题分析与解决办法
限制原因
你遇到的25条结果限制,根源是AWS Cognito的ListUsersInGroup API默认设置:该API默认单页最多返回25条用户数据,而Amazon.AspNetCore.Identity.Cognito包中的GetUsersInRoleAsync方法内部直接调用了这个API,且没有实现自动分页逻辑,所以只会返回第一页的25条结果,不会自动获取后续数据。
解决办法
无法直接取消这个限制,但可以通过手动处理分页的方式,调用Cognito原生API获取全部用户:
- 注入
AmazonCognitoIdentityProviderClient(需提前配置好AWS凭证和区域) - 编写自定义方法,循环请求API直到获取所有用户(利用返回的
NextToken判断是否还有下一页)
示例代码如下:
// 假设已注入AmazonCognitoIdentityProviderClient实例 private readonly AmazonCognitoIdentityProviderClient _cognitoClient; private readonly string _userPoolId = "你的Cognito用户池ID"; public async Task<List<CognitoUser>> GetAllUsersInGroupAsync(string groupName) { var allUsers = new List<CognitoUser>(); string nextToken = null; do { var request = new ListUsersInGroupRequest { GroupName = groupName, UserPoolId = _userPoolId, MaxResults = 60, // Cognito允许的单页最大结果数为60 NextToken = nextToken }; var response = await _cognitoClient.ListUsersInGroupAsync(request); // 将Cognito返回的用户数据转换为CognitoUser对象 allUsers.AddRange(response.Users.Select(user => new CognitoUser( user.Username, user.Attributes.First(a => a.Name == "email").Value, null, null, null ))); nextToken = response.NextToken; } while (!string.IsNullOrEmpty(nextToken)); return allUsers; }
注意事项
- 替换代码中的
_userPoolId为你实际的Cognito用户池ID - 根据你的用户属性配置调整
CognitoUser的构造参数(比如如果用户没有邮箱属性,需换其他必填属性) MaxResults可设置为1到60之间的数值,设为60能减少请求次数
内容的提问来源于stack exchange,提问作者Tom B.
相关产品推荐
相关产品推荐

