MSAL 2.x returns 不同 B2C 策略的现有身份验证结果

MSAL 2.x returns existing authentication result for a different B2C policy

更新 1 2021-10-24

  1. 我们正在使用两种不同的 'classic' sign-in/sign-up 策略,甚至早于 MSAL 0.15。我们不使用自定义策略。我相信我们可以使用应用程序的清单导出它们,这会有用吗?如果我 post 在这里,我会希望编辑可识别信息,但我不确定这是否会使它们无法用于目的...
  2. 关于 SSO,我认为 @JasSuri-MSFT 所说的是因为声明集是 same/similar,策略 ID 本身被忽略了(出于 SSO 目的)?这是否记录在某处,以便我们了解声明集需要有多大差异?
  3. 考虑到 SSO 行为,有没有办法让策略 ID 本身用于识别 SSO?这就是为什么我为 MSAL 2.x 做了这个初始 post 因为我可能在配置中缺少一些东西来恢复以前的行为。

初始值POST

我们最近将我们的 SPA 从 MSAL 0.x 升级到 2.x,升级为在 B2C 中使用 OAuth 2.0 授权代码流和 PKCE。这已完成并可与 2.16.1 一起使用,我们已尝试升级到 2.18.0 但没有成功解决以下 'issue'.

作为升级工作的一部分,我们注意到如果租户存在现有的身份验证结果,登录重定向将被绕过,我们会立即处理身份验证过程(又名 acquireTokenSilent()),这很好,因为如果我们刚刚登录并前往 SPA 的不同选项卡,我们会立即在该选项卡上登录。

但是,我们在同一个租户中使用具有不同 B2C 策略的不同 SPA,并且我们意外地从一个 SPA 策略获取不同 SPA 策略(在同一个租户中)的身份验证结果。我们的应用程序捕获了这一点并报告了一个错误(因为访问令牌中的声明不兼容),但我们正试图了解我们可以做些什么来防止这种混乱的情况。

作为背景,我在此表示歉意,并说我们使用的是 MSAL 0.1.5 (!!)。该版本下,每个SPA单独认证,每个SPA可以同时登录同一个租户,互不干扰(隶属于不同域)。

对于 MSAL 2.x 中的问题,情况已不再如此,并且身份验证(具体而言,声明)似乎 'leaking' 在 B2C 策略之间。我检查了 msal.PublicClientApplication() 的其他设置,但什么也没看到。我确实看到 acquireTokenSilent()forceRefresh 标志,但这表明它用于网络令牌检查并且打开它对获得跨策略身份验证结果没有影响。

我们确实注意到响应中包含的权限(通过 handleRedirectPromise() 传递)是第二个 SPA 的正确策略 ID。此外,当我们使用 acquireTokenSilent() 时,提供给我们 Web 服务器的访问令牌具有第二个 SPA 的正确策略 ID(在 tfp 声明中),但该访问令牌的声明是针对第一个 SPA 的策略和经过身份验证的用户。请注意,我们特别验证了第二个 SPA 的 tvps.AuthenticationType,这是正确的,因为 tfp 已更新!

这里是再现顺序(节略形式):

  1. 在选项卡 1 上打开 SPA 1 登录页面 (*)
  2. 重定向到 B2C 页面进行身份验证
  3. 重定向回 SPA 1,其中 acquireTokenSilent() 为 SPA 1
  4. 完成身份验证
  5. Web 服务器验证 SPA 1 的 SPA 1 访问令牌声明
  6. 在选项卡 2 上打开 SPA 2 登录页面 (*)
  7. 重定向回 SPA 2,其中 acquireTokenSilent() 为 SPA 2
  8. 完成身份验证
  9. Web 服务器拒绝 SPA 2 的 SPA 1 访问令牌声明,因为声明值与 API 调用不兼容,但 tfp 声明与第二个 SPA 的策略 ID
  10. 匹配

(*) 似乎在执行 msal.PublicClientApplication()/loginRedirect() 时,如果有最近的登录,B2C 登录页面重定向将被绕过,我们立即进入 handleRedirectPromise().似乎这是旧 SPA 1 登录的身份验证结果被传回的地方。请注意,响应的权限对于 SPA 2 是正确的。

这是 msal.PublicClientApplication() 配置中权限字段的格式:

authority: `https://<ourtenant>.b2clogin.com/tfp/<ourtenant>.onmicrosoft.com/B2C_1_${policyId}`

其中: policyId 的形式为“sign-up-in-spa”或“sign-up-in-spa-phn

所以:

更新2021-10-29

我们 运行 遇到了将单点登录配置设置为应用程序的问题。似乎在注销时(我们是基于策略的)它在租户中留下了 SSO cookie,因此当再次登录时(明确注销后)您立即再次登录(在 Web 应用程序会话生命周期内设定时间表)。

将此设置更改为策略解决了问题 - 现在注销会退出策略的登录。

初始答案

答案是此行为是在会话的 B2C 用户流中定义的。看来我们对 MSAL 0.15 的旧用法完全忽略了此设置,可能(?)因为我们使用的是隐式流。我们猜测使用 PKCE 的更安全的授权码启用了强制执行。

这是关于 B2C 会话行为的 Microsoft 文章:

https://docs.microsoft.com/en-us/azure/active-directory-b2c/session-behavior?pivots=b2c-user-flow

本质上:

  • 导航到 Azure 门户
  • Select想要的B2C目录
  • Select 用户流菜单
  • Select SUSI (Sign-up/Sign-in) 政策 - 我们的政策是 'Sign up and sign in (Standard legacy)'
  • Select 属性
  • 在会话行为部分下,将设置从租户(这是我们的)更改为:
    • 应用程序 - 这似乎是在应用程序注册级别。注销策略不会清除 SSO cookie - 参见上文更新
    • 策略 - 基于策略 ID
    • 已禁用

感谢@JasSuri-MSFT,因为你的评论让我对会话管理和 SSO 很感兴趣。