You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为AWS Cognito用户池用户分配独立角色并获取对应凭证

为Cognito用户分配独立角色并获取对应权限的规范方案

核心问题定位

你当前获取的是身份池默认已认证角色的权限,原因是身份池未配置基于用户组的角色映射规则,导致所有用户都被分配统一角色。要实现用户专属角色权限,需要通过用户池组绑定IAM角色 + 身份池角色映射的组合方案解决。

一、配置Cognito用户池组与IAM角色绑定

  1. 在IAM控制台创建不同权限的角色,比如针对Polly服务的基础用户角色、高级用户角色,每个角色的权限策略按需配置(比如限制神经语音使用、配额等)。
  2. 进入Cognito用户池控制台,创建用户组,每个组关联对应的IAM角色ARN。将用户加入对应组,确保用户的身份信息中包含cognito:groups声明(默认开启,无需额外配置)。

二、配置身份池的角色映射规则

  1. 打开Cognito身份池控制台,进入“身份验证提供商”,编辑已关联的用户池配置。
  2. 在“角色解析”部分选择使用令牌中的规则,然后添加角色映射规则:
    • 规则类型选“自定义”,属性选择cognito:groups,运算符选“包含”,值填写用户池组的名称,目标角色选择对应组绑定的IAM角色ARN。
    • 可添加多条规则对应不同用户组,还能设置规则优先级(数值越小优先级越高)。
  3. 可选:设置默认角色,用于未加入任何组的用户。

三、调整代码获取对应角色的临时凭证

登录逻辑不变,获取凭证时确保身份池的映射规则生效,代码可调整为:

// 登录用户(原有代码保留)
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权限问题

  1. 为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的配额管理功能实现。

  2. 验证客户端调用
    你原有的Polly客户端代码逻辑正确,只要凭证对应的角色有足够权限即可正常调用。若仍报错,排查点:

    • 角色权限策略是否正确配置并生效
    • 用户是否确实属于目标用户组
    • 身份池的角色映射规则是否匹配正确

五、关键注意事项

  • 同一用户可加入多个组,身份池会按规则优先级分配角色(优先级数值越小越优先)。
  • 确保用户池应用客户端未过滤cognito:groups声明,该属性默认包含在令牌中。
  • 临时凭证默认1小时过期,CognitoAWSCredentials会自动刷新,建议复用该对象而非重复创建。

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:51:17