如何使用 Azure AD B2C 在 react-aad-msal 中使用“忘记密码”?

IT技术 reactjs azure azure-active-directory adal adal.js
2021-05-11 21:43:23

我在Azure AD B2C 中使用react-aad-msal我有登录和注销工作。但是,当我单击“忘记密码?”时,身份验证窗口消失并且没有任何react。

在此处输入图片说明

似乎我需要指定我的“忘记密码”策略的名称,但我不知道把它放在哪里。

根据 Tony 的回答,将此代码添加到我的应用程序的渲染中:

if (window.location.href.indexOf("error_description=AADB2C90118") >= 0)
    {
      return <AzureAD
      provider={
        new MsalAuthProviderFactory({
          authority: 'https://login.microsoftonline.com/tfp/x5aaas.onmicrosoft.com/B2C_1_PwdReset', 
          clientID: 'a1568977-3095-4bf6-a6d6-c10c87658488',
          scopes: ['https://x5aaas.onmicrosoft.com/ui/use'],
          type: LoginType.Redirect,
          postLogoutRedirectUri: window.origin,
        })
      }
      unauthenticatedFunction={this.unauthenticatedFunction}
      userInfoCallback={this.userJustLoggedIn}
      authenticatedFunction={this.authenticatedFunction}
    />;
    }

我看到在单击“忘记密码?”后,条件为真,返回发生。但是,密码重置窗口没有出现,我被重定向回我的应用程序 URL。

有什么建议?

4个回答

我所做的是在我的 App.js 中创建一个路由:

          <Route
            path="/forgot"
            component={() => {
              window.location.href = forgotPasswordUrl;
              return null;
            }}
          />

然后,在 constructor

if (window.location.hash.indexOf('AADB2C90118') >= 0) {
  history.push('/forgot');
}

这有效。

在 Azure B2C 中使用组合注册/登录策略时,用户必须自己处理忘记密码的情况。您可以在此处找到更详细的评论

使用本地帐户的注册或登录用户流程包括“忘记密码?” 体验第一页上的链接。单击此链接不会自动触发密码重置用户流程。

相反,错误代码 AADB2C90118 会返回到您的应用程序。您的应用程序需要通过运行重置密码的特定用户流来处理此错误代码。要查看示例,请查看一个简单的 ASP.NET 示例,该示例演示了用户流的链接。

使用msal-react并且msal-browser我能够使用以下代码显示 Azure AD B2C 密码重置页面(假设您创建了一个名为 的密码重置用户流B2C_1_RESET):

import { useMsal } from "@azure/msal-react";
import { EventType } from '@azure/msal-browser';

....

const { instance, inProgress, accounts } = useMsal();

// MSAL Logging
//instance.setLogger(new Logger(loggerCallback));

const callbackId = instance.addEventCallback((message) => {
    if (message.eventType === EventType.LOGIN_FAILURE){
      if (message.error.errorMessage.includes("AADB2C90118")) { // The user has forgotten their password.
        const authority = "https://<your_domain>.b2clogin.com/crowdalert.onmicrosoft.com/B2C_1_RESET";
        instance.loginRedirect({authority: authority})
      }
    }
});

感谢 Ian 的提示。

您应该添加一个额外条件,以防用户取消更改重置其帐户凭据的尝试。这样他们就被重定向回登录而不是卡在你的应用程序上。

import { useMsal } from "@azure/msal-react";

export default MyComponent = () => {

// other code

const { instance, accounts, inProgress } = useMsal();

instance.addEventCallback((message: any) => {
    if (message.eventType === EventType.LOGIN_FAILURE && message.error.errorMessage.includes("AADB2C90118")) {
      // The user has forgotten their password.
      instance.loginRedirect(passwordResetRequest);
    } else if (message.eventType === EventType.HANDLE_REDIRECT_END && inProgress === InteractionStatus.None) {
      instance.loginRedirect(loginRequest);
    }
  });

// rest of component

};