跨域应用自定义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无法访问
问题
- 跨域应用场景下,是否只有使用身份提供商(IdP)的托管UI,带
prompt=none的SSO才能生效?因为只有托管UI可设置跨客户端共享Cookie? - 有没有基于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的
InitiateAuthAPI完成认证,获取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
相关产品推荐
相关产品推荐

