Azure B2C:KMSI 功能不适用于自定义策略

Azure B2C: KMSI feature does not work with custom policy

我们的 SPA 使用 Azure B2C 和 MSAL (React) 进行用户身份验证。还有其他要求,因此我们使用自定义策略而不是预定义的用户流。但是我很难在 these instructions.

之后实现保持登录 (KMSI) 功能
  1. 我使用了来自 the starter pack 的自定义策略:Phone_Email_Base.xmlSignUpOrSignInWithPhoneOrEmail.xml
  2. 已将 <Item Key="setting.enableRememberMe">True</Item> 条目添加到 <TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Phone-Email">
  3. 更新了依赖方策略文件:
<UserJourneyBehaviors>
  <SingleSignOn Scope="Tenant" KeepAliveInDays="30" />
  <SessionExpiryType>Absolute</SessionExpiryType>
  <SessionExpiryInSeconds>1200</SessionExpiryInSeconds>
  <ScriptExecution>Allow</ScriptExecution>
</UserJourneyBehaviors>
  1. 在我的 index.tsx following this 中设置 MSAL 实例。库版本:"@azure/msal-browser": "^2.14.2", "@azure/msal-react": "^1.0.0"
  2. 试图获取访问令牌:
msalInstance
   .acquireTokenSilent(accessTokenRequest)
   .then((response) => {
      // use response.accessToken here
      ...
    })
   .catch((e) => {
      console.error(e);
      if (e instanceof InteractionRequiredAuthError) {
         instance.acquireTokenRedirect(accessTokenRequest);
      }
   });

问题是 MSAL 无法在用户登录后 24 小时后静默检索访问令牌(即刷新令牌过期后),需要用户重新登录。

为确保我的应用程序代码正常,我尝试使用启用了 KMSI 功能的预定义用户流程(结合 B2C_1_SignUpSignIn)。在这种情况下,我的应用程序能够在 24 小时后静默获取访问令牌。因此 KMSI 与用户流完美配合,但不适用于自定义策略。

搜索文档和示例好几天了,但仍然找不到任何线索还需要在这里完成什么。任何帮助将不胜感激。

当 acquireTokenSilent() 失败时,MSAL 将调用 ssoSilent()。这将启动隐藏的 iframe 以尝试使用基于 cookie 的 SSO 获取令牌。

当这失败时,最后的错误会回来。您必须捕获此错误并调用 acquireTokenRedirect()。现在,如果您的技术配置文件的会话设置正确,并且存在有效的会话 cookie,您将获得 SSO。

https://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-policy-reference-sso

如果您确实看到了用户输入提示,则说明您的会话设置不适合该特定技术配置文件。这就是 ssoSilent() 失败的真正原因。

您的问题不是 KMSI。为了证明这一点,删除 KMSI 配置,登录到您的应用程序,从 LocalStorage 中删除 MSAL 对象,强制更新令牌。即使没有 KMSI,您也会在登录几分钟后重现您描述的问题。

好吧,最终证明这个解决方案确实有效。仍然不确定为什么在应用自定义策略后的前 24 小时后失败。所以我被迫在前 24 小时后 re-login 但当其他 24 小时过去后,我的应用程序能够在用户不提供凭据的情况下获得新的访问令牌。