基于Amazon Cognito到Quicksight的无服务器SSO/MFA免二次认证需求
解决Amazon Cognito MFA认证后直接SSO到AWS Quicksight的问题
问题背景
项目基于无服务器架构,通过Amazon Cognito用户池实现用户名/密码+MFA(认证应用/SMS)的用户认证,目标是完成Cognito到AWS Quicksight的SSO,要求用户通过Cognito Hosted UI完成MFA认证后,无需二次输入Quicksight凭证,直接跳转至指定仪表盘。当前已完成部分配置,但用户仍需在Quicksight重新认证,无法实现无缝跳转。
现有已实施配置
- 用S3静态网页作为Hosted UI,跳转至Quicksight做凭证校验
- 创建Lambda函数辅助凭证传输,通过Elastic Beanstalk管理
- 配置IAM策略限制未授权用户访问Quicksight
- 在Quicksight中配置SSO SAML认证并添加Beanstalk/S3静态URL
- 创建身份池并设置Implicit Allow策略
- 用API Gateway处理与Quicksight的Get/Post请求
- 无法使用CloudFront
解决方案步骤
1. 配置Cognito用户池作为SAML身份提供商(IdP)
- 进入Cognito用户池控制台,在联邦身份 > SAML身份提供商中,选择创建SAML身份提供商
- 导出Cognito的SAML元数据(在用户池的应用集成 > 域名页面,找到SAML元数据URL,下载XML文件)
- 确保用户池的MFA设置为强制或可选(匹配项目需求),且已启用对应的MFA类型(TOTP/SMS)
2. 调整Quicksight的SAML SSO配置
- 进入Quicksight控制台,在管理 > 单点登录(SSO)中,选择设置SAML
- 上传之前下载的Cognito SAML元数据XML文件,或手动输入元数据中的实体ID和SSO服务URL
- 设置回调URL为Cognito Hosted UI的回调地址(格式:
https://<your-cognito-domain>/oauth2/idpresponse) - 勾选启用自动登录选项,避免二次认证提示
3. 优化Cognito Hosted UI的跳转逻辑
- 移除S3静态网页的跳转逻辑,直接使用Cognito原生Hosted UI(用户池应用集成中配置的域名)作为用户访问端点
- 在Cognito用户池的应用客户端配置中,设置允许的OAuth流为
授权码流(Authorization Code Flow),隐式流不适用于SAML SSO场景 - 确保Cognito应用客户端的允许的OAuth范围包含Quicksight所需的用户属性,或在Lambda生成SAML断言时指定正确受众
4. 用Lambda生成并传递SAML断言(替代Beanstalk管理)
- 创建Lambda函数,在用户通过Cognito MFA认证后,接收Cognito授权码,调用
GetIdToken接口获取ID Token - 基于ID Token中的用户信息,生成符合Quicksight要求的SAML断言(需包含
NameID、email等必填属性) - 将生成的SAML断言通过POST请求发送到Quicksight的SAML ACS URL(可在Quicksight SSO配置中获取),实现自动跳转
5. 调整IAM策略与身份池配置
- 移除身份池的
Implicit Allow策略,改为基于Cognito用户池的身份验证授权:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "quicksight:DescribeDashboard", "Resource": "arn:aws:quicksight:<region>:<account-id>:dashboard/<dashboard-id>", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "<your-identity-pool-id>" } } } ] } - 确保Quicksight关联的IAM角色拥有访问指定仪表盘的权限,且该角色已与Cognito身份池绑定
6. 移除不必要的Elastic Beanstalk组件
- 项目要求无服务器架构,可直接通过API Gateway触发Lambda函数,替代Elastic Beanstalk的管理,降低架构复杂度
验证流程
- 用户访问Cognito Hosted UI域名
- 输入用户名、密码,完成MFA认证
- Cognito返回授权码,触发Lambda生成SAML断言
- Lambda自动将SAML断言POST到Quicksight ACS URL
- 用户直接跳转至指定Quicksight仪表盘,无需二次认证
内容的提问来源于stack exchange,提问作者Anthony Williams
相关产品推荐
相关产品推荐

