Important
自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息。
本文介绍如何为 Node.js Web 应用程序启用、自定义和增强 Azure Active Directory B2C(Azure AD B2C)身份验证体验。
在开始之前,请务必熟悉以下文章:
使用自定义域
通过使用 自定义域,可以完全打造身份验证 URL 的品牌。 从用户的角度来看,用户在身份验证过程中保留在域上,而不是重定向到Azure AD B2C b2clogin.cn 域名。
若要删除对 URL 中“b2c”的所有引用,还可以将身份验证请求 URL 中的 B2C 租户名称 contoso.partner.onmschina.cn 替换为租户 ID GUID。 例如,可以更改为 https://fabrikamb2c.b2clogin.cn/contoso.partner.onmschina.cn/https://account.contosobank.co.uk/<tenant ID GUID>/.
若要在身份验证 URL 中使用自定义域和租户 ID,请按照 “启用自定义域”中的指南进行操作。 在项目根文件夹下,打开 .env 文件。 此文件包含有关 Azure AD B2C 标识提供者的信息。
在 .env 文件中,执行以下操作:
- 将所有实例
tenant-name.b2clogin.cn替换为自定义域。 例如,替换tenant-name.b2clogin.cn到login.contoso.com。 - 将所有实例
tenant-name.partner.onmschina.cn替换为 租户 ID。 有关详细信息,请参阅 “使用租户 ID”。
以下配置显示更改前的应用设置:
#B2C sign up and sign in user flow/policy authority
SIGN_UP_SIGN_IN_POLICY_AUTHORITY=https://contoso.b2clogin.cn/contoso.partner.onmschina.cn/B2C_1_susi
#B2C password reset user flow/policy authority
RESET_PASSWORD_POLICY_AUTHORITY=https://contoso.b2clogin.cn/contoso.partner.onmschina.cn/B2C_1_passwordreset
#B2C edit profile user flow/policy authority
EDIT_PROFILE_POLICY_AUTHORITY=https://contoso.b2clogin.cn/contoso.partner.onmschina.cn/B2C_1_edit
#B2C authority domain
AUTHORITY_DOMAIN=https://contoso.b2clogin.cn
#client redirect url
APP_REDIRECT_URI=http://localhost:3000/redirect
#Logout endpoint
LOGOUT_ENDPOINT=https://contoso.b2clogin.cn/contoso.partner.onmschina.cn/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 会自动填充登录名,用户只需提供密码。
若要预填充登录名称,请执行以下操作:
- 如果使用自定义策略,请添加所需的输入声明,如 “设置直接登录”中所述。
- 查找对象
authCodeRequest,并使用登录提示设置loginHint属性。
以下代码片段演示如何传递登录提示参数。 它用作 bob@contoso.com 属性值。
authCodeRequest.loginHint = "bob@contoso.com"
return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
.then((response) => {
预先选择标识提供者
如果将应用程序的登录旅程配置为包含社交帐户,则可以指定 domain_hint 参数。 此查询参数提供有关应用于登录的社交标识提供者Azure AD B2C 的提示。
若要将用户重定向到外部标识提供者,请执行以下操作:
- 检查外部标识提供者的域名。 有关详细信息,请参阅将登录重定向到社交服务提供商。
- 查找对象
authCodeRequest,并使用相应的域提示设置domainHint属性。
以下代码片段演示如何传递域提示参数。
authCodeRequest.domainHint = "<YOUR_DOMAIN_HINT>"
return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
.then((response) => {
指定 UI 语言
Azure AD B2C 中的语言自定义使用户流能够适应各种语言以满足客户的需求。 有关详细信息,请参阅 语言自定义。
若要设置首选语言,请执行以下操作:
- 配置语言自定义。
- 查找对象
authCodeRequest,并使用相应的ui_locales额外参数设置extraQueryParameters属性。
以下代码片段演示如何传递 ui_locales 参数。 它用作 es-es 属性值。
authCodeRequest.extraQueryParameters = {"ui_locales" : "es-es"}
return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
.then((response) => {
传递自定义查询字符串参数
使用自定义策略,可以传递自定义查询字符串参数。 一个很好的用例示例是想要 动态更改页面内容。
若要传递自定义查询字符串参数,请执行以下操作:
- 配置 ContentDefinitionParameters 元素。
- 查找对象
authCodeRequest,并使用相应的额外参数设置extraQueryParameters属性。
以下代码片段演示如何传递 campaignId 自定义查询字符串参数。 它用作 germany-promotion 属性值。
authCodeRequest.extraQueryParameters = {"campaignId" : "germany-promotion"}
return confidentialClientApplication.getAuthCodeUrl(authCodeRequest)
.then((response) => {
传递 ID 令牌提示
信赖方应用程序可以将入站 JSON Web 令牌 (JWT) 作为 OAuth2 授权请求的一部分发送。 入站令牌是有关用户或授权请求的提示。 Azure AD B2C 验证令牌,然后提取声明。
若要在身份验证请求中包含 ID 令牌提示,请执行以下操作:
- 在自定义策略中,定义 ID 令牌提示技术配置文件。
- 查找对象
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允许指定日志记录级别。 可能的值:Error、Warning、Info和Verbose。 -
piiLoggingEnabled启用个人数据的输入。 可能的值:true或false。
以下代码片段演示如何配置 MSAL 日志记录:
const confidentialClientConfig = {
...
system: {
loggerOptions: {
loggerCallback(loglevel, message, containsPii) {
console.log(message);
},
piiLoggingEnabled: false,
logLevel: msal.LogLevel.Verbose,
}
}
};
后续步骤
详细了解 MSAL.js 配置选项。