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

为 Azure Active Directory B2C 启用自定义域

开始之前,可使用“选择策略类型”选择器来选择要设置的策略类型。 Azure Active Directory B2C 提供了两种定义用户如何与应用程序交互的方法:通过预定义的用户流,或者通过可完全配置的自定义策略。 对于每种方法,本文中所需的步骤都不同。

本文介绍如何在重定向 URL 中为 Azure Active Directory B2C (Azure AD B2C) 启用自定义域。 通过使用已验证的自定义域,你已获得如下优势:

  • 它提供更无缝的用户体验。 从用户角度来看,他们会在登录过程中保留在域中,而不是重定向到 Azure AD B2C 默认域 <tenant-name>.b2clogin.com。

  • 通过在登录期间使应用程序保持在同一域中,可以减轻第三方 Cookie 阻止的影响。

  • 你将可以在 Azure AD B2C 租户中创建的对象(用户帐户和应用程序)的数量从默认的 125 万个增加到 525 万个。

Screenshot demonstrates an Azure AD B2C custom domain user experience.

自定义域概述

可以使用 Azure Front Door 为 Azure AD B2C 启用自定义域。 Azure Front Door 是一个全局入口点,它使用 Microsoft 全局边缘网络来创建快速、安全且可大规模缩放的 Web 应用程序。 可以在 Azure Front Door 后面呈现 Azure AD B2C 内容,然后在 Azure Front Door 中配置一个选项,以通过应用程序 URL 中的自定义域来提供内容。

观看此视频来了解 Azure AD B2C 自定义域。

下图说明了 Azure Front Door 的集成方式:

  1. 在应用程序中,用户选择“登录”按钮将转到 Azure AD B2C 登录页。 在此页指定自定义域名。
  2. Web 浏览器将自定义域名解析到 Azure Front Door IP 地址。 在 DNS 解析过程中,一个带有自定义域名的规范名称 (CNAME) 记录将指向 Front Door 的默认前端主机(例如 contoso-frontend.azurefd.net)。
  3. 发至自定义域(例如 login.contoso.com)的流量将被路由到指定的 Front Door 默认前端主机 (contoso-frontend.azurefd.net)。
  4. Azure Front Door 使用 Azure AD B2C <tenant-name>.b2clogin.com 默认域调用 Azure AD B2C 内容。 针对 Azure AD B2C 终结点的请求包含原始自定义域名。
  5. Azure AD B2C 通过显示相关内容和原始自定义域来响应请求。

Diagram shows the custom domain networking flow.

重要

从浏览器到 Azure Front Door 的连接应始终使用 IPv4,而不是 IPv6。

使用自定义域时,请注意以下事项:

  • 可以设置多个自定义域。 有关最多支持的自定义域数,请参阅适用于 Azure AD B2C 的 Microsoft Entra 服务限制和约束以及适用于 Azure Front Door 的 Azure 订阅和服务限制、配额和约束
  • Azure Front Door 是单独的 Azure 服务,因此会产生额外费用。 有关详细信息,请参阅 Front Door 定价
  • 配置自定义域后,用户仍可以访问 Azure AD B2C 默认域名 <tenant-name>.b2clogin.com(除非你使用自定义策略并且阻止访问)。
  • 如果有多个应用程序,请将它们全部迁移到自定义域,因为浏览器会在当前使用的域名下存储 Azure AD B2C 会话。

先决条件

步骤 1:向 Azure AD B2C 租户添加自定义域名

每个新的 Azure AD B2C 租户都附带了初始域名 <domainname>.onmicrosoft.com。 无法更改或删除初始域名,但可添加自定义域。

按照以下步骤将自定义域添加到 Azure AD B2C 租户:

  1. 向 Microsoft Entra ID 添加自定义域名

    重要

    对于这些步骤,请确保登录到 Azure AD B2C 租户,并选择“Microsoft Entra ID”服务。

  2. 将 DNS 信息添加到域注册机构。 将自定义域名添加到 Microsoft Entra ID 后,为域创建一个 DNS TXTMX 记录。 为域创建此 DNS 记录可以验证域名的所有权。

    以下示例演示了 login.contoso.com 和 account.contoso.com 的 TXT 记录 :

    名称(主机名) 类型 数据
    login TXT MS=ms12345678
    account TXT MS=ms87654321

    TXT 记录必须与子域或域的主机名相关联。 例如,contoso.com 域中的 login 部分 。 如果主机名为空或为 @,则 Microsoft Entra ID 将无法验证你添加的自定义域。 在以下示例中,两个记录都未正确配置。

    名称(主机名) 类型 数据
    TXT MS=ms12345678
    @ TXT MS=ms12345678

    提示

    可使用任何公开提供的 DNS 服务(例如 GoDaddy)来管理自定义域。 如果没有 DNS 服务器,可使用 Azure DNS 区域应用服务域

  3. 验证自定义域名。 验证每个子域或你计划使用的主机名。 例如,要能够通过 login.contoso.com 和 account.contoso.com 登录,需要验证这两个子域,而不只是顶级域 contoso.com。

    重要

    验证域后,删除创建的 DNS TXT 记录。

步骤 2:创建新的 Azure Front Door 实例

按照以下步骤创建 Azure Front Door:

  1. 登录 Azure 门户

  2. 要选择包含要用于 Azure Front Door 的 Azure 订阅的目录,而不是包含 Azure AD B2C 租户的目录,请选择顶部菜单中的“设置”图标,从“目录 + 订阅”菜单切换到你的 Azure AD B2C 租户

  3. 按照创建 Front Door 配置文件 - 快速创建中的步骤使用以下设置为 Azure AD B2C 租户创建 Front Door:

    密钥
    订阅 选择 Azure 订阅。
    资源组 选择现有的资源组,或创建一个新的组。
    名称 为配置文件命名,例如 b2cazurefrontdoor
    选择“标准”或“高级”层。 标准层在内容传送方面经过优化。 高级层构建于标准层的基础之上,更注重安全性。 请参阅层级比较
    终结点名称 为终结点输入全局唯一的名称,例如 b2cazurefrontdoor。 “终结点主机名”将自动生成。
    源服务器类型 选择 Custom
    源主机名 输入 <tenant-name>.b2clogin.com。 将 <tenant-name> 替换为你的 Azure AD B2C 租户名称,例如 contoso.b2clogin.com

    将“缓存”和“WAF 策略”留空。

  4. 创建 Azure Front Door 资源后,选择“概述”,然后复制“终结点主机名”。 它类似于 b2cazurefrontdoor-ab123e.z01.azurefd.net

  5. 确保源的“主机名”和“源主机头”具有相同的值:

    1. 在“设置”下,选择“源组”。
    2. 从列表中选择源组,例如 default-origin-group。
    3. 在右侧窗格中,选择“源主机名”,例如 contoso.b2clogin.com
    4. 在“更新源”窗格中,更新“主机名”和“源主机头”,使其具有相同的值。

    Screenshot of how to update custom domain origins.

步骤 3:在 Azure Front Door 上设置自定义域

在此步骤中,将步骤 1 中注册的自定义域添加到 Azure Front Door。

3.1. 创建 CNAME DNS 记录

若要添加自定义域,请在域提供商的配合下创建规范名称 (CNAME) 记录。 CNAME 记录是一种 DNS 记录,用于将源域名映射到目标域名(别名)。 对于 Azure Front Door,源域名是自定义域名,目标域名是你在步骤 2. 创建新的 Azure Front Door 实例中配置的 Front Door 默认主机名。 例如,b2cazurefrontdoor-ab123e.z01.azurefd.net

在 Front Door 验证你创建的 CNAME 记录后,发往源自定义域(例如 login.contoso.com)的流量将路由到指定的目标 Front Door 默认前端主机(例如 contoso-frontend.azurefd.net)。 有关详细信息,请参阅将自定义域添加到 Front Door

若要创建自定义域的 CNAME 记录,请执行以下操作:

  1. 登录到你的自定义域的域提供商的网站。

  2. 查阅提供商的文档,或者在网站中搜索标有“域名”、“DNS”或“名称服务器管理”的区域,找到用于管理 DNS 记录的页面。

  3. 为自定义域创建一个 CNAME 记录条目并完成各个字段,如下表所示(字段名称可能有所不同):

    类型 目标
    <login.contoso.com> CNAME contoso-frontend.azurefd.net
    • 源:输入自定义域名(例如 login.contoso.com)。

    • 键入:输入 CNAME

    • 目标:输入你在步骤 2 中创建的默认 Front Door 前端主机。 必须采用 <主机名>.azurefd.net 格式 。 例如,contoso-frontend.azurefd.net

  4. 保存所做更改。

3.2. 将自定义域与 Front Door 相关联

  1. 在 Azure 门户主页中搜索 myb2cazurefrontdoor Azure Front Door 资源,并将其选中以将其打开。

  2. 在左侧菜单中的“设置”下,选择“域”。

  3. 选择“添加域”。

  4. 对于“DNS 管理”,请选择“所有其他 DNS 服务”。

  5. 对于“自定义域”,请输入你的自定义域,例如 login.contoso.com

  6. 将其他值保留默认值,然后选择“添加”。 你的自定义域随即会添加到列表中。

  7. 在刚刚添加的域的“验证状态”下,选择“等待中”。 此时会打开一个包含 TXT 记录信息的窗格。

    1. 登录到你的自定义域的域提供商的网站。

    2. 查阅提供商的文档,或者在网站中搜索标有“域名”、“DNS”或“名称服务器管理”的区域,找到用于管理 DNS 记录的页面。

    3. 创建新的 TXT DNS 记录并按如下所述填写字段:

      1. 名称:_dnsauth.contoso.com,但只需输入 _dnsauth
      2. 类型:TXT
      3. 值:类似于 75abc123t48y2qrtsz2bvk......

      添加 TXT DNS 记录后,Front Door 资源中的“验证状态”最终将从“等待中”更改为“已批准”。 可能需要重新加载页面才能看到这种状态更改。

  8. 返回 Azure 门户。 在刚刚添加的域的“终结点关联”下,选择“未关联”。

  9. 对于“选择终结点”,请从下拉列表中选择主机名终结点。

  10. 对于“选择路由”列表,请选择“default-route”,然后选择“关联”。

3.3. 启用路由

default-route 将流量从客户端路由到 Azure Front Door。 然后,Azure Front Door 使用你的配置将流量发送到 Azure AD B2C。 按照以下步骤启用 default-route。

  1. 选择“Front Door 管理器”。

  2. 若要启用 default-route,请首先从 Front Door 管理器中的终结点列表中展开某个终结点。 然后选择“default-route”。

    以下屏幕截图显示了如何选择 default-route。

    Screenshot of selecting the default route.

  3. 选中“启用路由”复选框。

  4. 选择“更新”以保存更改。

步骤 4:配置 CORS

如果使用 HTML 模板自定义 Azure AD B2C 用户界面,则需要配置 CORS 以使用自定义域。

请按照以下步骤配置 Azure Blob 存储以进行跨域资源共享:

  1. Azure 门户中导航到存储帐户。
  2. 在菜单中,选择“CORS”。
  3. 对于“允许的源”,请输入 https://your-domain-name。 将 your-domain-name 替换为你的自定义域名。 例如,https://login.contoso.com。 输入租户名称时全部使用小写字母。
  4. 对于“允许的方法”,请同时选择 GETOPTIONS
  5. 对于“允许的标头”,请输入一个星号 (*)。
  6. 对于“公开的标头”,请输入一个星号 (*)。
  7. 对于“最大期限”,请输入 200。
  8. 选择“保存”。

测试自定义域

  1. 登录 Azure 门户

  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,从“目录 + 订阅”菜单切换到你的 Azure AD B2C 租户。

  3. 在 Azure 门户中,搜索并选择“Azure AD B2C”。

  4. 在“策略”下,选择“用户流(策略)”。

  5. 选择一个用户流,然后选择“运行用户流”。

  6. 对于“应用程序”,请选择前面已注册的名为 webapp1 的 Web 应用程序。 “回复 URL”应显示为 https://jwt.ms

  7. 复制“运行用户流终结点”下的 URL。

    Screenshot of how to copy the authorization request U R I.

  8. 若要使用自定义域模拟登录,请打开 Web 浏览器并使用复制的 URL。 将 Azure AD B2C 域(<tenant-name>.b2clogin.com)替换为你的自定义域。

    例如,不是:

    https://contoso.b2clogin.com/contoso.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1_susi&client_id=63ba0d17-c4ba-47fd-89e9-31b3c2734339&nonce=defaultNonce&redirect_uri=https%3A%2F%2Fjwt.ms&scope=openid&response_type=id_token&prompt=login
    

    而是使用:

    https://login.contoso.com/contoso.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1_susi&client_id=63ba0d17-c4ba-47fd-89e9-31b3c2734339&nonce=defaultNonce&redirect_uri=https%3A%2F%2Fjwt.ms&scope=openid&response_type=id_token&prompt=login    
    
  9. 验证是否已正确加载 Azure AD B2C。 然后使用本地帐户登录。

  10. 对于其余策略重复此测试。

配置标识提供者

当用户选择使用社交标识提供者登录时,Azure AD B2C 会启动授权请求,并将用户转到所选的标识提供者来完成登录过程。 授权请求将为 redirect_uri 指定 Azure AD B2C 默认域名:

https://<tenant-name>.b2clogin.com/<tenant-name>/oauth2/authresp

如果已将策略配置为允许使用外部标识提供者登录,请将 OAuth 重定向 URI 更新为自定义域。 大多数标识提供者都允许注册多个重定向 URI。 建议添加重定向 URI,而不是替换它们,这样既可以测试自定义策略,又不会影响使用 Azure AD B2C 默认域名的应用程序。

在以下重定向 URI 中:

https://<custom-domain-name>/<tenant-name>/oauth2/authresp
  • 将 <custom-domain-name> 替换为你的自定义域名。
  • 将 <tenant-name> 替换为你的租户名称或租户 ID。

以下示例显示了一个有效的 OAuth 重定向 URI:

https://login.contoso.com/contoso.onmicrosoft.com/oauth2/authresp

如果选择使用租户 ID,有效的 OAuth 重定向 URI 将如以下示例所示:

https://login.contoso.com/11111111-1111-1111-1111-111111111111/oauth2/authresp

SAML 标识提供者元数据将如以下示例所示:

https://<custom-domain-name>.b2clogin.com/<tenant-name>/<your-policy>/samlp/metadata?idptp=<your-technical-profile>

配置应用程序

在配置并测试自定义域后,可以更新应用程序来加载将自定义域指定为主机名(而不是 Azure AD B2C 域)的 URL。

自定义域集成适用于身份验证终结点,它们使用 Azure AD B2C 策略(用户流或自定义策略)对用户进行身份验证。 这些终结点可能如以下示例所示:

  • https://<custom-domain>/<tenant-name>/<policy-name>/v2.0/.well-known/openid-configuration

  • https://<custom-domain>/<tenant-name>/<policy-name>/oauth2/v2.0/authorize

  • https://<custom-domain>/<tenant-name>/<policy-name>/oauth2/v2.0/token

将:

  • custom-domain 替换为你的自定义域名
  • tenant-name 替换为租户名称或租户 ID
  • policy-name 替换为你的策略名称。 详细了解 Azure AD B2C 策略

SAML 服务提供商元数据可能如以下示例所示:

https://custom-domain-name/tenant-name/policy-name/Samlp/metadata

(可选)使用租户 ID

可以将 URL 中的 B2C 租户名称替换为你的租户 ID GUID,以便删除对 URL 中“B2C”的所有引用。 在“Azure 门户”的“B2C 概述”页中可找到你的租户 ID GUID。 例如,将 https://account.contosobank.co.uk/contosobank.onmicrosoft.com/ 更改为 https://account.contosobank.co.uk/<tenant ID GUID>/

如果选择使用租户 ID 而不是租户名称,请确保相应地更新标识提供者的 OAuth 重定向 URI。 有关详细信息,请参阅配置标识提供者

令牌颁发

令牌颁发者名称 (iss) 声明根据所使用的自定义域而进行变化。 例如:

https://<domain-name>/11111111-1111-1111-1111-111111111111/v2.0/

(可选)阻止访问默认域名

在添加自定义域和配置应用程序后,用户仍能访问 <tenant-name>.b2clogin.com 域。 要阻止访问,可以将策略配置为对照允许的域列表检查授权请求的“主机名”。 主机名是指 URL 中显示的域名。 通过{Context:HostName}声明解析器可获取主机名。 然后,则可以显示自定义错误消息。

  1. 获取检查来自 GitHub 的主机名的条件访问策略的示例。
  2. 在每个文件中,将字符串 yourtenant 替换为 Azure AD B2C 租户的名称。 例如,如果 B2C 租户的名称为 contosob2c,则 yourtenant.onmicrosoft.com 的所有实例都将变为 contosob2c.onmicrosoft.com
  3. 按以下顺序上传策略文件:先是 B2C_1A_TrustFrameworkExtensions_HostName.xmlB2C_1A_signup_signin_HostName.xml 次之。

(可选)Azure Front Door 高级配置

可以使用 Azure Front Door 高级配置,例如 Azure Web 应用程序防火墙 (WAF)。 Azure WAF 可在出现常见攻击和漏洞时为 Web 应用程序提供集中保护。

使用自定义域时,请注意以下几点:

  • WAF 策略必须与 Azure Front Door 配置文件位于同一个层。 若要详细了解如何创建 WAF 策略以用于 Azure Front Door,请参阅配置 WAF 策略
  • WAF 托管规则功能不受官方支持,因为它可能会导致误报并阻止合法请求通过,因此请仅使用符合需求的 WAF 自定义规则。

疑难解答

Azure AD B2C 返回“未找到页面”错误

  • 症状 - 你配置了自定义域,但在尝试使用该自定义域登录时收到 HTTP 404 错误消息。
  • 可能的原因 - 此问题可能与 DNS 配置或 Azure Front Door 后端配置相关。
  • 解决方法
    • 请确保该自定义域在 Azure AD B2C 租户中已注册并成功通过验证
    • 请确保该自定义域配置正确。 自定义域的 CNAME 记录必须指向 Azure Front Door 默认的前端主机(例如 contoso-frontend.azurefd.net)。

我们的服务当前不可用

  • 症状 - 你配置了自定义域,但在尝试使用该自定义域登录时收到以下错误消息:“我们的服务当前不可用。我们正在努力以求尽快恢复所有服务。请稍后回来查看”。

  • 可能的原因 - 此问题可能与 Azure Front Door 路由配置有关。

  • 解决方法:检查 default-route 的状态。 如果 default-route 已禁用,请启用该路由。 以下屏幕截图显示了 default-route 的状态:

    Screenshot of the status of the default-route.

Azure AD B2C 返回“你查找的资源已被删除,已更改名称或暂不可用”。

  • 症状 - 你配置了自定义域,但在尝试使用该自定义域登录时收到“你查找的资源已被删除、已更改名称或暂不可用”错误消息。
  • 可能的原因 - 此问题可能与 Microsoft Entra 自定义域验证相关。
  • 解决方法:确保该自定义域在 Azure AD B2C 租户中已注册并成功通过验证

标识提供者返回错误

  • 症状 - 配置自定义域后,可以使用本地帐户登录。 但若使用来自外部社交或企业标识提供者的凭据登录,标识提供者会显示错误消息。
  • 可能的原因 - 当 Azure AD B2C 引导用户使用联合标识提供者登录时,会指定重定向 URI。 重定向 URI 是标识提供者返回令牌的终结点。 重定向 URI 与应用程序对授权请求使用的域相同。 如果重定向 URI 尚未在标识提供者处注册,则它可能不信任新的重定向 URI,从而导致错误消息。
  • 解决方法 - 按照配置标识提供者中的步骤添加新的重定向 URI。

常见问题

在使用“立即运行”尝试运行我的策略时,为什么看不到自定义域?

复制 URL,手动更改域名,然后将其粘贴回你的浏览器。

对于 Azure AD B2C 显示哪个 IP 地址? 用户的 IP 地址还是 Azure Front Door IP 地址?

Azure Front Door 传递用户的原始 IP 地址。 这就是你将在审核报告或自定义策略中要看到的 IP 地址。

重要

如果客户端将 x-forwarded-for 标头发送到 Azure Front Door,则 Azure AD B2C 会将发起方的 x-forwarded-for 作为用户的 IP 地址用于条件访问评估{Context:IPAddress}声明解析程序

是否可以对 B2C 使用第三方 Web 应用程序防火墙 (WAF)?

是的,Azure AD B2C 支持 BYO-WAF(自带 Web 应用程序防火墙)。 但是,必须测试 WAF 以确保它不会阻止对 Azure AD B2C 用户流或自定义策略发送合法请求,也不会对这种请求发出警报。 了解如何使用 Azure AD B2C 配置 Akamai WAFCloudflare WAF

我的 Azure Front Door 实例是否可以托管在与 Azure AD B2C 租户不同的订阅中?

是的,Azure Front Door 可以在不同的订阅中。

后续步骤

了解 OAuth 身份验证请求