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

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主要分两类:

  1. AAD全局认证Cookie
    • 典型的有ESTSAUTH(会话级,关闭浏览器就失效)和ESTSAUTHPERSISTENT(持久化,可保留一段时间),存储在login.microsoftonline.com域名下。这些是AAD用来识别用户已完成全局登录的核心凭证,只要这些Cookie有效,同一租户下的应用可以免密获取令牌。
  2. 应用本地令牌存储
    • 你的Angular应用使用的SSO库(比如MSAL.js)会在应用的子域下存储令牌相关数据:可能是存在localStorage里的msal.idtoken、msal.access_token等条目,也可能是存储在子域域名下的Cookie(比如msal.session.state)。这些是应用自己用来缓存令牌的,不会跨子域共享,也不属于AAD直接生成的认证Cookie。
    • 你看不到完整的那个应该是AAD域名下的全局Cookie,打开浏览器开发者工具→「应用」→「Cookie」→选择login.microsoftonline.com就能看到完整列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:38:06