你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过使用 Azure Active Directory B2C 在 Node.js Web 应用中启用身份验证选项

本文介绍如何启用、自定义和增强 Node.js Web 应用程序的 Azure Active Directory B2C (Azure AD B2C) 身份验证体验。

在开始之前,请务必先熟悉以下文章:

使用自定义域

通过使用自定义域,可以完全标记身份验证 URL。 从用户的角度来看,用户在身份验证过程中仍留在你的域中,而不是重定向到 Azure AD B2C b2clogin.com 域名。

若要删除对 URL 中“b2c”的所有引用,还可以将身份验证请求 URL 中的 B2C 租户名称 (contoso.onmicrosoft.com) 替换为你的租户 ID GUID。 例如,可以将 https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ 更改为 https://account.contosobank.co.uk/<tenant ID GUID>/

若要在身份验证 URL 中使用自定义域和租户 ID,请按照启用自定义域中的指南进行操作。 在项目根文件夹下,打开 .env 文件。 此文件包含有关 Azure AD B2C 标识提供者的信息。

在该 .env 文件中,执行以下操作:

  • tenant-name.b2clogin.com 的所有实例替换为你的自定义域。 例如,将 tenant-name.b2clogin.com 替换为 login.contoso.com
  • tenant-name.onmicrosoft.com 的所有实例替换为你的租户 ID。 有关详细信息,请参阅使用租户 ID

以下配置显示了更改前的应用设置:

#B2C sign up and sign in user flow/policy authority
SIGN_UP_SIGN_IN_POLICY_AUTHORITY=https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_susi
#B2C password reset user flow/policy authority
RESET_PASSWORD_POLICY_AUTHORITY=https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_passwordreset
#B2C edit profile user flow/policy authority
EDIT_PROFILE_POLICY_AUTHORITY=https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_edit
#B2C authority domain
AUTHORITY_DOMAIN=https://contoso.b2clogin.com
#client redirect url
APP_REDIRECT_URI=http://localhost:3000/redirect
#Logout endpoint 
LOGOUT_ENDPOINT=https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_susi/oauth2/v2.0/logout?post_logout_redirect_uri=http://localhost:3000

以下配置显示了更改后的应用设置:

#B2C sign up and sign in user flow/policy authority
SIGN_UP_SIGN_IN_POLICY_AUTHORITY=https://login.contoso.com/12345678-0000-0000-0000-000000000000/B2C_1_susi
#B2C password reset user flow/policy authority
RESET_PASSWORD_POLICY_AUTHORITY=https://login.contoso.com/12345678-0000-0000-0000-000000000000/B2C_1_passwordreset
#B2C edit profile user flow/policy authority
EDIT_PROFILE_POLICY_AUTHORITY=https://login.contoso.com/12345678-0000-0000-0000-000000000000/B2C_1_edit
#B2C authority domain
AUTHORITY_DOMAIN=https://login.contoso.com
#client redirect url
APP_REDIRECT_URI=http://localhost:3000/redirect
#Logout endpoint 
LOGOUT_ENDPOINT=https://login.contoso.com/12345678-0000-0000-0000-000000000000/B2C_1_susi/oauth2/v2.0/logout?post_logout_redirect_uri=http://localhost:3000

预填充登录名

在登录用户旅程中,你的应用可能会针对特定用户。 当应用针对用户时,它可以在授权请求中使用用户登录名指定 login_hint 查询参数。 Azure AD B2C 自动填充登录名,用户只需要提供密码。

若要预填充登录名,请执行下列操作:

  1. 如果使用的是自定义策略,请按照设置直接登录中的说明添加所需的输入声明。
  2. 找到 authCodeRequest 对象,然后使用登录提示来设置 loginHint 属性。

以下代码片段演示如何传递登录提示参数。 它会使用 bob@contoso.com 作为属性值。

authCodeRequest.loginHint = "bob@contoso.com"

return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
        .then((response) => {

预先选择标识提供程序

如果已将应用程序的登录旅程配置为包括社交帐户(如 Facebook、LinkedIn 或 Google),则可以指定 domain_hint 参数。 此查询参数向 Azure AD B2C 提供有关应该用于登录的社交标识提供者的提示。 例如,如果应用程序指定 domain_hint=facebook.com,登录流会直接转到 Facebook 登录页。

要将用户重定向到外部标识提供程序,请执行以下操作:

  1. 检查外部标识提供者的域名。 有关详细信息,请参阅将登录重定向到社交服务提供商
  2. 找到 authCodeRequest 对象,然后使用相应的域提示来设置 domainHint 属性。

以下代码片段演示如何传递域提示参数。 它使用 facebook.com 作为属性值。

authCodeRequest.domainHint = "facebook.com"

return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
        .then((response) => {

指定 UI 语言

可使用 Azure AD B2C 中的语言自定义让用户流适应各种不同的语言,从而满足客户需求。 有关详细信息,请参阅语言自定义

要设置首选语言,请执行下列操作:

  1. 配置语言自定义
  2. 找到 authCodeRequest 对象,然后使用相应的额外参数 ui_locales 来设置 extraQueryParameters 属性。

以下代码片段演示了如何传递 ui_locales 参数。 它使用 es-es 作为属性值。

authCodeRequest.extraQueryParameters = {"ui_locales" : "es-es"}

return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
        .then((response) => {

传递自定义查询字符串参数

借助自定义策略,可以传递自定义查询字符串参数。 例如,当你需要动态更改页面内容时。

若要传递自定义查询字符串参数,请执行以下操作:

  1. 配置 ContentDefinitionParameters 元素。
  2. 找到 authCodeRequest 对象,然后使用相应的额外参数来设置 extraQueryParameters 属性。

以下代码片段演示了如何传递 campaignId 自定义查询字符串参数。 它使用 germany-promotion 作为属性值。

authCodeRequest.extraQueryParameters = {"campaignId" : "germany-promotion"}

return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
        .then((response) => {

传递 ID 令牌提示

信赖方应用可随附 OAuth2 授权请求发送入站 JSON Web 令牌 (JWT)。 入站令牌是有关用户或授权请求的提示。 Azure AD B2C 会验证令牌,然后提取声明。

要在身份验证请求中包含 ID 令牌提示,请执行以下操作:

  1. 在自定义策略中,定义 ID 令牌提示技术配置文件
  2. 找到 authCodeRequest 对象,然后使用相应的额外参数 id_token_hint 来设置 extraQueryParameters 属性。

以下代码片段演示如何定义 ID 令牌提示:

authCodeRequest.extraQueryParameters = {"id_token_hint": idToken}

return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)

配置日志记录

MSAL 库生成可帮助诊断问题的日志消息。 应用可配置日志记录。 应用还可以让你对详细程度以及是否记录个人和组织数据进行自定义控制。

建议创建 MSAL 日志记录回叫,并提供一种方式来让用户在遇到身份验证问题时提交日志。 MSAL 提供以下级别的日志记录详细信息:

  • 错误:出现问题并已生成错误。 此级别用于调试并确定问题。
  • 警告:不一定会出现错误或故障,但该信息用于诊断和找到问题。
  • 信息:MSAL 记录用于参考但不一定用于调试的事件。
  • 详细:这是默认级别。 MSAL 将记录库行为的完整详细信息。

默认情况下,MSAL 记录器不捕获任何个人或组织数据。 该库提供相关选项,允许你自行决定是否记录个人和组织数据。

若要配置日志记录,请在 index.js 中配置以下键:

  • logLevel 允许指定日志记录级别。 可能的值:ErrorWarningInfoVerbose
  • piiLoggingEnabled 启用个人数据的输入。 可能的值:truefalse

下面的代码片段演示如何配置 MSAL 日志记录:

 const confidentialClientConfig = {
    ...
    system: {
        loggerOptions: {
            loggerCallback(loglevel, message, containsPii) {
                console.log(message);
            },
            piiLoggingEnabled: false,
            logLevel: msal.LogLevel.Verbose,
        }
    }
};

后续步骤

详细了解 MSAL.js 配置选项