如何在AWS Cognito用户池中验证联邦登录并限制仅指定用户可登录
AWS Cognito限制第三方IdP指定用户登录解决方案
首先明确:该需求完全可通过AWS Cognito原生能力实现,核心依赖Cognito的Lambda触发器机制,在第三方用户完成IdP身份验证后、Cognito发放访问令牌前插入自定义校验逻辑,具体实现步骤如下:
1. 前置准备
- 提前梳理允许登录的用户唯一标识(如邮箱、企业员工ID),推荐存储在AWS DynamoDB表中(低延迟查询,也可使用其他Lambda可访问的存储介质),表主键设置为你选择的用户标识字段(如
email) - 确认Cognito用户池已完成第三方IdP(SAML ADFS、Google等)的集成,且已将IdP返回的用户唯一标识字段映射到Cognito用户属性中
2. 开发校验逻辑Lambda函数
可选择任意Lambda支持的运行时,以Python为例,核心逻辑参考如下:
import boto3 # 初始化DynamoDB客户端 dynamodb = boto3.resource('dynamodb') allow_list_table = dynamodb.Table('你的允许用户列表DynamoDB表名') def lambda_handler(event, context): # 从Cognito事件中获取用户属性,此处以邮箱为例,可替换为你使用的唯一标识字段 user_identity = event['request']['userAttributes']['email'].strip().lower() # 匹配允许列表 try: query_resp = allow_list_table.get_item(Key={'email': user_identity}) # 不在列表内直接抛出异常终止登录流程 if 'Item' not in query_resp: raise Exception("当前账号不在允许访问列表中,无法登录") except Exception as e: raise e # 匹配成功,返回原事件继续后续令牌发放流程 return event
注意:需要为该Lambda配置对应DynamoDB表的只读访问权限,且Lambda需与Cognito用户池处于同一AWS区域。
3. 绑定触发器到Cognito用户池
- 打开AWS Cognito控制台,进入对应用户池的配置页面,选择「用户池属性」选项卡
- 找到「Lambda触发器」配置区块,触发器类型选择预身份验证,下拉选择刚才创建的Lambda函数,保存配置即可生效
4. 特殊场景适配
- 若不同IdP返回的用户标识字段名不同(比如部分SAML IdP的邮箱字段为
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress),可在Lambda中先判断用户来源IdP,再对应取值即可 - 允许列表更新直接操作存储的DynamoDB表即可,无需修改Lambda或Cognito配置
内容的提问来源于stack exchange,提问作者zeeshan peerzade
相关产品推荐
相关产品推荐

