Azure B2C:KMSI 功能不适用于自定义策略
Azure B2C: KMSI feature does not work with custom policy
我们的 SPA 使用 Azure B2C 和 MSAL (React) 进行用户身份验证。还有其他要求,因此我们使用自定义策略而不是预定义的用户流。但是我很难在 these instructions.
之后实现保持登录 (KMSI) 功能
- 我使用了来自 the starter pack 的自定义策略:
Phone_Email_Base.xml
和 SignUpOrSignInWithPhoneOrEmail.xml
- 已将
<Item Key="setting.enableRememberMe">True</Item>
条目添加到 <TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Phone-Email">
- 更新了依赖方策略文件:
<UserJourneyBehaviors>
<SingleSignOn Scope="Tenant" KeepAliveInDays="30" />
<SessionExpiryType>Absolute</SessionExpiryType>
<SessionExpiryInSeconds>1200</SessionExpiryInSeconds>
<ScriptExecution>Allow</ScriptExecution>
</UserJourneyBehaviors>
- 在我的 index.tsx following this 中设置 MSAL 实例。库版本:
"@azure/msal-browser": "^2.14.2", "@azure/msal-react": "^1.0.0"
- 试图获取访问令牌:
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 小时过去后,我的应用程序能够在用户不提供凭据的情况下获得新的访问令牌。
我们的 SPA 使用 Azure B2C 和 MSAL (React) 进行用户身份验证。还有其他要求,因此我们使用自定义策略而不是预定义的用户流。但是我很难在 these instructions.
之后实现保持登录 (KMSI) 功能- 我使用了来自 the starter pack 的自定义策略:
Phone_Email_Base.xml
和SignUpOrSignInWithPhoneOrEmail.xml
- 已将
<Item Key="setting.enableRememberMe">True</Item>
条目添加到<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Phone-Email">
- 更新了依赖方策略文件:
<UserJourneyBehaviors>
<SingleSignOn Scope="Tenant" KeepAliveInDays="30" />
<SessionExpiryType>Absolute</SessionExpiryType>
<SessionExpiryInSeconds>1200</SessionExpiryInSeconds>
<ScriptExecution>Allow</ScriptExecution>
</UserJourneyBehaviors>
- 在我的 index.tsx following this 中设置 MSAL 实例。库版本:
"@azure/msal-browser": "^2.14.2", "@azure/msal-react": "^1.0.0"
- 试图获取访问令牌:
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 小时过去后,我的应用程序能够在用户不提供凭据的情况下获得新的访问令牌。