如何将Azure AD令牌中的角色等属性映射至AWS Cognito令牌?
将Azure角色转移至AWS Cognito访问令牌的解决方案
要把Azure令牌中的roles声明同步到Cognito生成的访问令牌里,需要通过身份提供商声明映射+Pre Token Generation Lambda触发器来实现,具体步骤如下:
1. 提前配置Cognito用户池自定义属性
在Cognito用户池的「属性」选项卡中,添加一个自定义属性custom:roles,类型选择「字符串」,勾选「可写入」和「可读」,用于存储从Azure传递过来的角色信息。
2. 配置Azure身份提供商的声明映射
根据你使用的身份协议(OIDC/SAML),将Azure的roles声明映射到Cognito的custom:roles属性:
- OIDC协议:在Cognito用户池的「身份提供商」→ 你的Azure OIDC提供商 →「属性映射」中,添加映射规则:将Azure的
roles声明映射到Cognito的custom:roles属性。 - SAML协议:在Cognito用户池的「身份提供商」→ 你的Azure SAML提供商 →「属性映射」中,将SAML断言中的角色属性(通常是
http://schemas.microsoft.com/ws/2008/06/identity/claims/role)映射到Cognito的custom:roles属性。
3. 创建Pre Token Generation Lambda触发器
编写Lambda函数,在Cognito生成访问令牌前,将custom:roles中的角色信息添加到令牌声明中:
exports.handler = async (event) => { // 从用户属性中获取Azure传递的角色 const azureRoles = event.request.userAttributes['custom:roles']; let rolesArray = []; // 处理角色格式,兼容字符串或JSON数组 if (azureRoles) { try { rolesArray = JSON.parse(azureRoles); } catch (err) { // 如果是单个角色的字符串形式,转为数组 rolesArray = [azureRoles]; } } // 将角色添加到访问令牌的claims中 event.response = { claimsOverrideDetails: { // 添加roles声明到令牌 claimsToAddOrOverride: { 'roles': rolesArray }, // 可选:同时设置Cognito用户组(如果需要用组权限) groupOverrideDetails: { groupsToOverride: rolesArray } } }; return event; };
4. 关联Lambda触发器到Cognito用户池
在Cognito用户池的「触发器」选项卡中,找到「Pre Token Generation」触发器,选择你刚创建的Lambda函数并保存。
验证结果
完成配置后,重新通过授权码流获取Cognito访问令牌,解码令牌即可看到roles声明已经包含Azure传递的角色信息。
内容的提问来源于stack exchange,提问作者Naved Akhtar
相关产品推荐
相关产品推荐

