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

跨域应用自定义UI下OIDC SSO失效问题及解决方案咨询

跨域OIDC单点登录(SSO)问题:AWS Cognito下自定义UI无法共享会话

背景

  • App1:前后端基于PHP开发,部署于app1.stk.in
  • App2:前端基于Angular、后端基于Python开发,部署于app2.cloud.net
  • 两个应用共用同一AWS Cognito用户池,仅客户端ID不同

目标

用户登录App1后,访问App2时自动完成SSO登录,无需重复验证。当前尝试通过带prompt=none参数的URL实现静默登录,但该方式会跳转至AWS Cognito托管UI;希望无有效会话时使用自定义登录UI。

故障现象

  • 使用自定义UI时SSO失效,App2无法识别用户已在App1登录的状态
  • 会话Cookie仅绑定在app1.stk.in域名下,app2.cloud.net无法访问

问题

  1. 跨域应用场景下,是否只有使用身份提供商(IdP)的托管UI,带prompt=none的SSO才能生效?因为只有托管UI可设置跨客户端共享Cookie?
  2. 有没有基于OIDC的安全方案可实现跨域共享会话状态?

回答

问题1解答

不是必须依赖托管UI,但IdP层面的跨域会话Cookie是实现跨客户端SSO的核心前提。

AWS Cognito的托管UI会将会话Cookie设置在Cognito自身的域名下(例如xxx.auth.region.amazoncognito.com),这个Cookie属于整个用户池,所有同池客户端都能共享。当应用调用带prompt=none的授权请求时,Cognito会读取这个Cookie判断用户是否已登录,从而静默返回授权码或令牌。

如果使用自定义UI且仅在App1域名下处理登录逻辑,会话Cookie会被绑定到app1.stk.in,App2的域名无法跨域读取。此时即使调用prompt=none,Cognito端没有对应的会话Cookie,就会返回登录要求,导致SSO失效。

问题2解答

有几种基于OIDC的安全方案可以实现跨域SSO,结合AWS Cognito的特性,推荐以下两种:

1. 自定义UI+复用Cognito跨域会话Cookie

保留自定义登录UI,但调整登录流程让Cognito种下跨域会话Cookie:

  • 用户在自定义UI输入账号密码后,由应用后端调用Cognito的InitiateAuth API完成认证,获取IdToken/AccessToken的同时,确保Cognito在自身域名下生成会话Cookie(需在认证请求中指定合法的redirect_uri,让Cognito的响应包含Cookie)。
  • 后续App2调用带prompt=none的授权请求时,Cognito会读取自身域名下的会话Cookie,确认用户已登录后静默返回授权码,完成SSO。
  • 这种方式既保留了自定义UI的灵活性,又利用Cognito的跨域Cookie实现会话共享。

2. 结合OIDC Back-Channel Logout实现会话同步(可选增强)

如果需要跨应用的会话一致性(比如一处登出全端失效),可以开启Cognito的Back-Channel Logout功能:

  • 在Cognito用户池配置中开启Back-Channel Logout,添加两个应用的后端Logout端点。
  • 当用户在App1登出时,Cognito会主动通知App2的后端,触发App2清除本地会话,保证跨应用会话状态同步。

关键注意事项

  • 所有应用的redirect_uri必须在Cognito用户池的允许列表中。
  • 跨域Cookie的SameSite属性需设置为Lax或None(跨站场景),且必须在HTTPS环境下运行(Cognito默认要求HTTPS)。
  • 自定义UI的登录流程必须触发Cognito生成跨域会话Cookie,不能仅在应用本地存储会话信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:50:03