Azure SSO无重定向退出?Cognito联合登录会话复用问题
联合Cognito与Azure AD的登录/登出问题解决方案
问题背景
我使用Amazon Cognito用户池,将Azure AD作为OIDC身份提供商做联合认证,采用Cognito托管UI和授权码流。应用通过重定向到以下地址启动登录:
https://<my-domain>.auth.<region>.amazoncognito.com/oauth2/authorize ?response_type=code &client_id=<client_id> &redirect_uri=<callback> &identity_provider=<MyAzureOIDCProvider> &prompt=login
核心问题
用户退出应用(已清理应用自身会话/Cookie)后,再次登录会静默复用之前的会话:Cognito直接返回首个登录用户的授权码,不会跳转至Azure让用户选择身份。在共享浏览器中,第二个用户无法用自己的账号登录,Cognito/Microsoft始终返回首个用户的身份,导致第二个用户被拦截。
已尝试无效操作
- 在
/oauth2/authorize请求中添加prompt=login或prompt=select_account参数 → 无效,Cognito复用自身托管UI会话,未跳转至Azure - 后端向Azure登出端点发起服务器端HTTP请求 → 无效,会话Cookie存储在用户浏览器的Microsoft域中,后端请求无法操作客户端Cookie
疑问1:是否只有浏览器重定向至Cognito /logout端点才能清除联合会话?有没有后端/非重定向方案?
是的,必须通过浏览器重定向才能清除联合会话,不存在后端非重定向方案。原因如下:
- Cognito托管UI的会话Cookie存储在Cognito专属域名下,只有浏览器发起的请求才能访问并清除这些Cookie
- Azure AD的会话Cookie存储在
login.microsoftonline.com域名下,同样只能由用户浏览器操作,后端服务器无法跨域修改客户端Cookie
疑问2:如何正确链式清除Cognito会话与Azure/STS会话,确保下次登录强制选择账户?
正确的链式登出需要通过浏览器重定向分两步完成:
- 清除Cognito会话:引导用户浏览器重定向到Cognito登出端点:
该请求会清除Cognito托管UI的会话Cookie,同时自动重定向到Azure AD的登出端点。https://<my-domain>.auth.<region>.amazoncognito.com/logout?client_id=<client_id>&logout_uri=<post_logout_redirect_uri> - 清除Azure AD会话:Cognito会将用户重定向到Azure AD的登出端点,并携带
post_logout_redirect_uri参数。完成Azure会话清除后,用户会被重定向回你指定的logout_uri地址。
若要确保下次登录强制选择账户,后续发起登录请求时需满足疑问3中的条件,确保prompt=select_account参数被转发到Azure AD。
疑问3:prompt=login/prompt=select_account是否会从Cognito转发至OIDC身份提供商?什么条件下会转发?
这些参数会被Cognito转发至OIDC身份提供商,但需要满足以下条件:
- 登录请求中必须明确指定
identity_provider=<MyAzureOIDCProvider>参数,告知Cognito直接使用Azure AD作为身份提供商,而非显示Cognito的身份选择界面 - Cognito自身没有有效会话:如果Cognito托管UI存在未过期的会话,它会直接复用该会话,不会将
prompt参数转发给Azure AD - Cognito用户池的OIDC身份提供商配置未禁用参数转发(默认允许)
之前添加prompt参数无效的核心原因,就是Cognito自身的托管UI会话未被清除,导致它直接复用会话,没有触发向Azure AD的跳转。
内容的提问来源于stack exchange,提问作者Mrex
相关产品推荐
相关产品推荐

