如何为AWS Cognito用户池用户分配独立角色并获取对应凭证
为Cognito用户分配独立角色并获取对应权限的规范方案
核心问题定位
你当前获取的是身份池默认已认证角色的权限,原因是身份池未配置基于用户组的角色映射规则,导致所有用户都被分配统一角色。要实现用户专属角色权限,需要通过用户池组绑定IAM角色 + 身份池角色映射的组合方案解决。
一、配置Cognito用户池组与IAM角色绑定
- 在IAM控制台创建不同权限的角色,比如针对Polly服务的基础用户角色、高级用户角色,每个角色的权限策略按需配置(比如限制神经语音使用、配额等)。
- 进入Cognito用户池控制台,创建用户组,每个组关联对应的IAM角色ARN。将用户加入对应组,确保用户的身份信息中包含
cognito:groups声明(默认开启,无需额外配置)。
二、配置身份池的角色映射规则
- 打开Cognito身份池控制台,进入“身份验证提供商”,编辑已关联的用户池配置。
- 在“角色解析”部分选择使用令牌中的规则,然后添加角色映射规则:
- 规则类型选“自定义”,属性选择
cognito:groups,运算符选“包含”,值填写用户池组的名称,目标角色选择对应组绑定的IAM角色ARN。 - 可添加多条规则对应不同用户组,还能设置规则优先级(数值越小优先级越高)。
- 规则类型选“自定义”,属性选择
- 可选:设置默认角色,用于未加入任何组的用户。
三、调整代码获取对应角色的临时凭证
登录逻辑不变,获取凭证时确保身份池的映射规则生效,代码可调整为:
// 登录用户(原有代码保留) AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials()); CognitoUserPool userPool = new CognitoUserPool("eu-central-1_XXXXXXXX", "xxxxxxxxxxxxxxxxxxxxxxxxx", provider); CognitoUser user = new CognitoUser("Username", "yyyyyyyyyyyyyyyyyyyyyyyyy", userPool, provider); InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest() { Password = "PWD" }; AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false); // 获取对应组角色的临时凭证 CognitoAWSCredentials awsCredentials = user.GetCognitoAWSCredentials( "eu-central-1:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", RegionEndpoint.EUCentral1 ); // 主动刷新凭证以获取最新角色权限 await awsCredentials.GetCredentialsAsync(); ImmutableCredentials iCredentials = awsCredentials.GetCredentials(); // 可选:验证分配的角色是否正确 var identityClient = new AmazonCognitoIdentityClient(iCredentials, RegionEndpoint.EUCentral1); var identityId = await user.GetIdentityIdAsync(); var rolesResponse = await identityClient.GetRolesForIdentityAsync(new GetRolesForIdentityRequest { IdentityId = identityId }); MessageBox.Show($"当前用户角色ARN: {rolesResponse.Roles.FirstOrDefault()}");
四、解决AWS Polly权限问题
为IAM角色配置Polly权限
给对应角色添加以下策略(按需调整):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "polly:SynthesizeSpeech", "Resource": "*", "Condition": { "StringEquals": { "polly:Engine": "neural" // 限制仅使用神经引擎,可删除此条件放开限制 }, "ForAnyValue:StringEquals": { "polly:VoiceId": ["Matthew", "Joanna"] // 限制允许使用的语音 } } } ] }如需控制配额,可通过IAM服务控制策略(SCP)或Polly的配额管理功能实现。
验证客户端调用
你原有的Polly客户端代码逻辑正确,只要凭证对应的角色有足够权限即可正常调用。若仍报错,排查点:- 角色权限策略是否正确配置并生效
- 用户是否确实属于目标用户组
- 身份池的角色映射规则是否匹配正确
五、关键注意事项
- 同一用户可加入多个组,身份池会按规则优先级分配角色(优先级数值越小越优先)。
- 确保用户池应用客户端未过滤
cognito:groups声明,该属性默认包含在令牌中。 - 临时凭证默认1小时过期,
CognitoAWSCredentials会自动刷新,建议复用该对象而非重复创建。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

