内容提要
本文介绍自建IdP对接Amazon QuickSight双端SSO的实战方法:Desktop端使用OIDC+PKCE,Web端需新增SAML 2.0并发出AWS专用断言。需配置AWS侧SAML Provider和IAM Role,注意ARN的region留空,并确保SAML与OIDC共享会话避免二次登录。
延伸解读
双协议收敛是 SSO 成功的关键
QuickSight 的 Desktop 端使用 OIDC + PKCE,Web 端使用 SAML 2.0,两者必须指向同一个 IdP 并共享会话,否则用户会遭遇二次登录。文章指出,Desktop 登录本身包含一次 Web 认证,若 Web 端缺少 SAML 通道,就会退回原生密码页。因此,自建 IdP 不仅要实现 SAML,还要确保 SAML 与 OIDC 两条链路共用同一套会话机制,才能实现真正的单点登录。
AWS 联邦 SAML 断言有硬性要求
通用 SAML 断言无法直接用于 AWS 联邦,必须包含 AWS 专用属性,如 Role 和 RoleSessionName,且属性名大小写敏感。Role 属性值必须是 role_arn,provider_arn 的逗号对,RoleSessionName 需符合特定字符限制。此外,断言必须用 X.509 证书签名,并确保 Recipient 和 Audience 为 https://signin.aws.amazon.com/saml。任何一项缺失或错误都会导致 AWS STS 拒绝请求。
ARN 中 region 留空是常见坑
在配置 QuickSight 权限策略时,Resource 中的 ARN 必须将 region 段留空,写成 arn:aws:quicksight::<ACCOUNT_ID>:user/${aws:userid} 的形式。如果误填了 region(如 us-east-1),会导致 JIT 创建用户时资源不匹配,触发 implicitDeny,登录失败。文章强调,不要简单放宽为 *,而应保持 region 留空,这是经过 IAM Policy Simulator 验证的根因。
排查二次登录问题需检查会话共享
如果用户先 SAML 登录再 OIDC 登录,说明 IdP 的两条协议链路没有共享 SSO 会话。文章建议排查 SAML 和 OIDC 的 authorize URL 是否使用同一会话 cookie,并确保一条链路登录后另一条能静默通过。解决方向是让两条端点收敛到同一套会话机制,这需要 IdP 侧调整,而非 QuickSight 或 AWS 侧能修改。
Q&A
Amazon QuickSight 的 Web 端和 Desktop 端分别使用什么认证协议?
Web 端使用 SAML 2.0,Desktop 端使用 OIDC + PKCE。
自建 IdP 对接 Amazon QuickSight 时,为什么 Web 端必须实现 SAML 2.0?
因为 Desktop 端登录内含一次 Web 认证,如果 Web 端没有 SAML 通道,用户会被退回 QuickSight 原生密码页,无法实现单点登录。
AWS 侧配置 SAML 联邦时,需要创建哪些资源?
需要创建 SAML Provider(上传 IdP 的 metadata)和 IAM Role(信任该 Provider 并授予 QuickSight 权限)。
SAML 断言中必须包含哪些 AWS 专用属性?
必须包含 Role 属性(值为 role_arn,provider_arn 逗号对)和 RoleSessionName 属性(2-64 字符,仅允许字母数字 _ . , + = @ -,不能含空格)。
为什么 IAM 权限策略中 QuickSight 用户 ARN 的 region 必须留空?
因为 QuickSight 联邦 JIT 发起 CreateAdmin 时,针对的 user ARN 是无 region 的(quicksight:: 两个冒号),如果策略写了 region,会导致 implicitDeny,登录失败。
如何解决 SAML 和 OIDC 登录两次的问题?
需要让 IdP 的 SAML 和 OIDC 两条链路共享同一份 SSO 会话,用户在其中一条登录后,另一条凭会话 cookie 静默通过,无需二次认证。
QuickSight 管理端配置 SSO 时,需要设置哪些参数?
需要设置 IdP URL(IdP 的 SAML SSO 发起地址)和 RelayState parameter(固定值 RelayState),并开启 Email Syncing for Federated Users。