Azure AD SSO跨子域登出后刷新报错AADSTS50059咨询
解决AADSTS50059错误及相关SSO疑问
首先,先明确你遇到的Error AADSTS50059: No tenant identifying information found in either the request or implied by any provided credentials错误的核心原因:当你刷新sd2.domain.com时,浏览器向Azure AD发起的认证请求里,既没有明确指定租户ID,也没有能让AAD推断出租户的有效凭证(比如全局认证Cookie),导致AAD无法确定该用哪个租户处理你的身份验证。结合你的场景,这是因为登出sd1时触发了AAD的全局单点登出,清除了关键的全局认证Cookie,而sd2的配置可能依赖这些Cookie来推断租户,从而报错。
接下来逐个解答你的疑问:
Q1:同一租户下的AAD应用,是否某个AAD生成的Cookie会影响另一个?
答案是肯定的,核心区别在于AAD全局认证Cookie和应用自身站点Cookie:
- AAD生成的全局Cookie(比如
ESTSAUTH、ESTSAUTHPERSISTENT)存储在login.microsoftonline.com域名下,是同一租户下所有应用共享的,用来标记用户在AAD层面的登录状态。当你从任意一个应用发起单点登出时,默认流程会向AAD的登出端点请求,清除这些全局Cookie,这就会导致同一租户下的其他应用失去AAD层面的登录凭证,刷新时需要重新认证。 - 每个子域应用自己生成的站点Cookie(比如MSAL.js存在
localStorage里的msal.idtoken、msal.access_token,或者应用自身域名下的会话Cookie)是完全独立的,不会被其他子域的操作覆盖或删除——但这些只是应用本地存储的令牌,一旦AAD的全局Cookie被清除,应用向AAD发起新的令牌请求时就会因为没有身份凭证而失败。
Q2:Azure AD SSO机制中的认证Cookie是什么?存储在哪里?
Azure AD的SSO相关Cookie主要分两类:
- AAD全局认证Cookie
- 典型的有
ESTSAUTH(会话级,关闭浏览器就失效)和ESTSAUTHPERSISTENT(持久化,可保留一段时间),存储在login.microsoftonline.com域名下。这些是AAD用来识别用户已完成全局登录的核心凭证,只要这些Cookie有效,同一租户下的应用可以免密获取令牌。
- 典型的有
- 应用本地令牌存储
- 你的Angular应用使用的SSO库(比如MSAL.js)会在应用的子域下存储令牌相关数据:可能是存在
localStorage里的msal.idtoken、msal.access_token等条目,也可能是存储在子域域名下的Cookie(比如msal.session.state)。这些是应用自己用来缓存令牌的,不会跨子域共享,也不属于AAD直接生成的认证Cookie。 - 你看不到完整的那个应该是AAD域名下的全局Cookie,打开浏览器开发者工具→「应用」→「Cookie」→选择
login.microsoftonline.com就能看到完整列表。
- 你的Angular应用使用的SSO库(比如MSAL.js)会在应用的子域下存储令牌相关数据:可能是存在
Q3:如何实现同一租户下登出一个应用不影响另一个?
要避免单点登出影响其他应用,核心是不要触发AAD的全局登出流程,只清除当前应用的本地令牌和会话:
- 调整SSO库的登出逻辑:比如使用MSAL.js时,调用
logout()方法时指定account参数(只清除当前应用关联的账号会话),并且不要使用全局登出端点。例如:const account = msalInstance.getAccountByUsername("user@domain.com"); msalInstance.logout({ account: account, postLogoutRedirectUri: "https://sd1.domain.com/logout", mainWindowRedirectUri: "https://sd1.domain.com/logout" }); - 避免使用
common作为权限端点:把每个应用的authority配置明确指定为租户ID(比如https://login.microsoftonline.com/your-tenant-guid),而不是https://login.microsoftonline.com/common。这样即使全局Cookie被清除,应用刷新时会直接向指定租户发起认证请求,不会因为找不到租户信息而抛出50059错误。 - 使用弹窗登出而非重定向登出:调用
logoutPopup()代替logoutRedirect(),这样登出流程只会在弹窗中处理当前应用的会话,不会触发AAD的全局登出逻辑。
内容的提问来源于stack exchange,提问作者gottacodeemall
相关产品推荐
相关产品推荐

