在 Azure 中部署 Active Directory 联合身份验证服务

Active Directory 联合身份验证服务 (AD FS) 提供了简便而安全的联合身份验证和 Web 单一登录 (SSO) 功能。 与 Microsoft Entra ID 和 Microsoft 365 联合的用户可以使用本地凭据进行身份验证,以访问所有云资源。 因此,部署必须具有高度可用的 AD FS 基础结构,以确保对本地和云中资源的访问。

在 Azure 中部署 AD FS 可以帮助轻松实现高可用性。 在 Azure 中部署 AD FS 有几个优点:

  • Azure 可用性集的强大功能为你提供了高度可用的基础结构。
  • 部署易于缩放。 如果需要更高的性能,可以使用 Azure 中的简化部署过程轻松迁移到功能更强大的计算机。
  • Azure 异地冗余可确保基础结构在全球范围内高度可用。
  • Azure 门户通过高度简化的管理选项使基础结构更易于管理。

设计原则

下图显示了在 Azure 中部署 AD FS 基础结构的建议基本拓扑。

图表显示了在 Azure 中部署 AD FS 基础结构的建议基本拓扑。

我们建议网络拓扑遵循以下一般原则:

  • 在单独的服务器上部署 AD FS,以避免影响域控制器的性能。
  • 必须部署 Web 应用程序代理 (WAP) 服务器,以便用户在不在公司网络上时可以访问 AD FS。
  • 应在非管制区域 (DMZ) 中设置 Web 应用程序代理服务器,并且仅允许 DMZ 和内部子网之间的 TCP/443 访问。
  • 为了确保 AD FS 和 Web 应用程序代理服务器的高可用性,建议对 AD FS 服务器使用内部负载均衡器,对 Web 应用程序代理服务器使用 Azure 负载均衡器。
  • 要为 AD FS 部署提供冗余,建议将两个或更多虚拟机 (VM) 分组到一个可用性集中,以用于类似的工作负载。 此配置可确保在计划内或计划外维护事件期间至少有一个 VM 可用。
  • 应在单独的 DMZ 网络中部署 Web 应用程序代理服务器。 可以将一个虚拟网络划分为两个子网,然后在隔离的子网中部署 Web 应用程序代理服务器。 可以为每个子网配置网络安全组设置,并仅允许两个子网之间的所需通信。

部署网络

创建网络时,可以在同一虚拟网络中创建两个子网,也可以创建两个不同的虚拟网络。 建议使用单网络方法,因为创建两个单独的虚拟网络还需要创建两个用于通信目的的单独虚拟网络网关。

创建虚拟网络

创建虚拟网络:

  1. 使用 Azure 帐户登录到 Azure 门户

  2. 在门户中,搜索并选择“虚拟网络”。

  3. 在“虚拟网络”页面上,选择“+ 创建”。

  4. 创建虚拟网络中,转到基本信息选项卡,并配置以下设置:

    • 项目详细信息下配置以下设置:

      • 对于订阅,请选择订阅的名称。

      • 对于资源组,请选择现有资源组的名称,或选择新建以创建新资源组。

    • 实例详细信息配置以下设置:

      • 对于虚拟网络名称,请输入虚拟网络的名称。

      • 对于区域,请选择要在其中创建虚拟网络的区域。

  5. 选择下一步

  6. 安全性选项卡中,启用要使用的任何安全服务,然后选择下一步

  7. IP 地址选项卡上,选择要编辑的子网的名称。 在本例中,我们将编辑服务自动创建的默认子网。

  8. 在“编辑子网”页上,将子网重命名为 INT

  9. 输入子网的 IP 地址子网大小信息,以定义 IP 地址空间

  10. 对于网络安全组,请选择“新建”。

  11. 在此示例中,输入名称 NSG_INT 并选择“确定”,然后选择“保存”。 你现在拥有了第一个子网。

    显示如何编辑子网并添加内部网络安全组的屏幕截图。

  12. 若要创建第二个子网,请选择“+ 添加子网”。

  13. 添加子网页上,输入 DMZ 作为第二个子网名称,然后在空字段中输入有关子网的信息以定义 IP 地址空间

  14. 对于网络安全组,请选择“新建”。

  15. 输入名称 NSG_DMZ,选择“确定”,然后选择“添加”。

    显示如何添加新子网(包括网络安全组)的屏幕截图。

  16. 依次选择“查看 + 创建”、“创建”。

现在,你有一个包含两个子网的虚拟网络,每个子网都有一个关联的网络安全组。

显示新子网及其网络安全组的屏幕截图。

保护虚拟网络

网络安全组 (NSG) 包含一系列访问控制列表 (ACL) 规则,这些规则可以允许或拒绝虚拟网络中流向 VM 实例的网络流量。 可将 NSG 与任一子网或该子网内的单个 VM 实例关联。 当 NSG 与子网关联时,ACL 规则将应用于该子网中的所有 VM 实例。

与子网关联的 NSG 会自动包含一些默认的入站和出站规则。 无法删除默认安全规则,但可以使用更高优先级的规则将其覆盖。 此外,可以根据所需的安全级别添加更多入站和出站规则。

现在,将几个规则添加到两个安全组中的每一个。 对于第一个示例,将入站安全规则添加到 NSG_INT 安全组。

  1. 在虚拟网络的子网页上,选择 NSG_INT

  2. 在左侧,选择“入站安全规则”,然后选择“+ 添加”。

  3. 添加入站安全规则中,使用以下信息配置规则:

    • 对于“”,输入 10.0.1.0/24

    • 对于源端口范围,如果不想允许流量,请将其留空;或者如果选择星号 (*),则允许任何端口上的流量。

    • 对于目标,请输入 10.0.0.0/24

    • 对于服务,选择 HTTPS。 根据选择的服务,该服务会自动填充目标端口范围协议的信息字段。

    • 对于“操作”,请选择“允许”。

    • 对于优先级,请输入 1010

    • 对于名称,请输入 AllowHTTPSFromDMZ

    • 有关说明,请输入允许来自 DMZ 的 HTTPS 通信

  4. 完成后,选择添加

    显示如何添加入站安全规则的屏幕截图。新的入站安全规则现已添加到 NSG_INT 规则列表的顶部。

  5. 对下表中显示的值重复这些步骤。 除了创建的新规则之外,还必须按列出的优先级顺序添加以下额外规则,以帮助保护内部子网和 DMZ 子网。

    NSG 规则类型 目标 服务 操作 优先级 名称 说明
    NSG_INT 出站 任意 服务标记/Internet 自定义(80/Any) 拒绝 100 DenyInternetOutbound 无法访问 Internet。
    NSG_DMZ 入站 任意 任意 自定义(星号(*)/Any) Allow 1010 AllowHTTPSFromInternet 允许从 Internet 到 DMZ 的 HTTPS。
    NSG_DMZ 出站 任意 服务标记/Internet 自定义(80/Any) 拒绝 100 DenyInternetOutbound 除 HTTPS 到 Internet 之外的任何内容都将被阻止。
  6. 输入完每个新规则的值后,选择添加并继续执行下一个规则,直到为每个 NSG 添加两个新的安全规则。

配置后,NSG 页面应如下图所示:

添加安全规则后显示 NSG 的屏幕截图。

注意

如果虚拟网络需要客户端用户证书身份验证(例如,使用 X.509 用户证书的 clientTLS 身份验证),则必须启用 TCP 端口 49443 进行入站访问。

创建到本地的连接

需要连接到本地才能在 Azure 中部署 DC。 可以使用以下选项之一将本地基础结构连接到 Azure 基础结构:

  • 点到站点
  • 虚拟网络站点
  • ExpressRoute

如果组织不需要点到站点连接或虚拟网络站点到站点连接,建议使用 ExpressRoute。 使用 ExpressRoute,可在 Azure 数据中心与本地环境或共同租用环境中的基础结构之间创建专用连接。 ExpressRoute 连接也不连接到公共 Internet,这使得它们更可靠、更快、更安全。 有关详细了解 ExpressRoute 以及如何使用 ExpressRoute 的各种连接选项,请阅读 ExpressRoute technical overview(ExpressRoute 技术概述)。

创建可用性集

对于每个角色(DC/AD FS 和 WAP),请创建至少包含两台计算机的可用性集。 此配置有助于提高每个角色的可用性。 在创建可用性集时,必须决定要使用以下哪个域:

  • 在容错域中,VM 共享相同的电源和物理网络交换机。 建议至少使用两个容错域。 默认值为 2,可以按原样保留此部署。

  • 在更新域中,计算机在更新期间一起重启。 建议至少两个更新域。 默认值为 5,可以按原样保留此部署。

若要创建可用性集,请执行以下操作:

  1. 在Azure 门户中搜索并选择可用性集,然后选择 + 创建

  2. 创建可用性集中,转到基本信息选项卡,然后输入以下信息:

    • 在“项目详细信息”下

      • 对于订阅,请选择订阅的名称。

      • 对于资源组,请选择现有资源组,或选择新建以创建新资源组。

    • 在“实例详细信息”下:

      • 对于名称,输入可用性集的名称。 对于此示例,请输入 contosodcset

      • 对于区域,选择要使用的区域。

      • 对于容错域,请将其保留为默认值 2

      • 对于更新域,请将其保留为默认值 5

      • 对于使用托管磁盘,请在此示例中选择否(经典)

    显示如何创建可用性集的屏幕截图。

  3. 完成后,在查看 + 创建页面上选择创建

  4. 重复上述步骤,创建名为 contososac2 的第二个可用性集。

部署虚拟机

下一步是部署在基础结构中托管不同角色的 VM。 建议在每个可用性集中至少两台计算机。 在本例中,我们为基本部署创建了四个 VM。

若要创建 VM,请执行以下操作:

  1. 在 Azure 门户中,搜索并选择虚拟机

  2. 虚拟机”上,选择“+ 创建”,然后选择“Azure 虚拟机”。

  3. 创建虚拟机中,转到基本信息选项卡,并输入以下信息:

    • 在“项目详细信息”下

      • 对于订阅,请选择订阅的名称。

      • 对于资源组,请选择现有资源组,或选择新建以创建新资源组。

    • 在“实例详细信息”下:

      • 虚拟机名称中,为 VM 输入一个名称。 对于本例中的第一台计算机,请输入 contosodc1

      • 对于区域,选择要使用的区域。

      • 对于可用性选项,请选择可用性集

      • 对于可用性集,请选择 contosodcset

      • 对于“安全类型”,请选择“标准”。

      • 对于订阅,请选择订阅的名称。

      • 对于映像,请选择要使用的映像,然后选择配置 VM 代系,然后选择第 1 代

    • 在“管理员帐户”下:

      • 对于“身份验证类型”,请选择“SSH 公钥”

      • 对于用户名,输入要用于帐户的用户名。

      • 对于密钥对名称,输入要用于账户的密钥对名称。

    • 对于未指定的任何内容,可以保留默认值。

  4. 完成后,请选择下一步:磁盘显示如何创建虚拟机的首要步骤的屏幕截图。

  5. 网络选项卡中,输入以下信息:

    • 对于虚拟网络,选择包含你在上一节中创建的子网的虚拟网络的名称。

    • 对于子网,请选择你的 INT 子网。

    • 对于“NIC 网络安全组”,请选择“无” 。

    • 对于未指定的任何内容,可以保留默认值。 显示如何创建虚拟机的“网络”选项卡的屏幕截图。

  6. 做出所有选择后,选择查看 + 创建,然后选择创建

使用下表中的信息重复这些步骤,以创建其余三个 VM:

虚拟机名称 子网 可用性选项 可用性集 存储帐户
contosodc2 INT 可用性集 contosodcset contososac2
contosowap1 DMZ 可用性集 contosowapset contososac1
contosowap2 DMZ 可用性集 contosowapset contososac2

这些设置未指定 NSG,因为 Azure 允许在子网级别使用 NSG。 可以使用与子网或网络接口卡 (NIC) 对象关联的单个 NSG 来控制计算机网络流量。 有关详细信息,请参阅什么是网络安全组 (NSG)

如果要管理 DNS,建议使用静态 IP 地址。 可以使用 Azure DNS,并通过域的 DNS 记录中的 Azure FQDN 来引用新计算机。 有关详细信息,请参阅将专用 IP 地址更改为静态

虚拟机页应在部署完成后显示所有四个 VM。

配置 DC 和 AD FS 服务器

若要对任何传入请求进行身份验证,AD FS 需要联系 DC。 若要节省从 Azure 到本地 DC 的开销,以便进行身份验证,建议在 Azure 中部署 DC 的副本。 为了获得高可用性,最好创建至少两个 DC 的可用性集。

域控制器 角色 存储帐户
contosodc1 副本 contososac1
contosodc2 副本 contososac2

建议你执行以下操作:

  • 使用 DNS 将两个服务器提升为副本 DC

  • 使用服务器管理器安装 AD FS 角色来配置 AD FS 服务器。

创建和部署内部负载均衡器 (ILB)

若要创建和部署 ILB,请执行以下操作:

  1. 在 Azure 门户中搜索并选择负载均衡器,然后选择 + 创建

  2. 在“创建负载平衡器”中,在“基本信息”选项卡中输入或选择此信息:

    • 在“项目详细信息”下

      • 对于订阅,请选择订阅的名称。

      • 对于资源组,请选择现有资源组,或选择新建以创建新资源组。

    • 在“实例详细信息”下:

      • 对于名称,请输入负载均衡器的名称。

      • 对于区域,选择要使用的区域。

      • 对于类型,选择内部

    • SKU保留为默认值,然后选择“下一步:前端 IP 配置显示如何创建负载均衡器的“基本信息”选项卡的屏幕截图。

  3. 选择“添加前端 IP 配置”,然后在“添加前端 IP 配置”页中输入或选择此信息。

    • 对于名称,输入前端 IP 配置名称。

    • 对于虚拟网络,请选择要在其中部署 AD FS 的虚拟网络。

    • 对于子网,请选择 INT,这是你在上一节中创建的内部子网。

    • 对于分配,请选择静态

    • 对于 IP 地址,请输入 IP 地址。

    • 将“可用性区域”保留为默认值,然后选择“添加”。 显示如何在创建负载均衡器时添加前端 IP 配置的屏幕截图。

  4. 选择下一步:后端池,然后选择 + 添加后端池

  5. 添加后端池页上,在名称字段中输入后端池的名称。 在 IP 配置区域中,选择 + 添加

  6. 在“添加后端池”页上,选择要与后端池保持一致的 VM,选择“添加”,然后选择“保存”。 显示如何在创建负载均衡器时添加后端池的屏幕截图。

  7. 选择下一步:入站规则

  8. 入站规则选项卡上,选择添加负载均衡规则,然后在添加负载均衡规则页中输入以下信息:

    • 对于名称,输入规则的名称。

    • 对于前端 IP 地址,请选择之前创建的地址。

    • 对于后端池,选择之前创建的后端池。

    • 对于“协议”,请选择“TCP”。

    • 对于“端口”,请输入 443。

    • 对于后端端口,请选择新建,然后输入以下值来创建运行状况探测:

      • 对于名称,输入运行状况探测的名称。

      • 对于协议,输入 HTTP

      • 对于端口,请输入 80

      • 对于路径,请输入 /adfs/probe

      • 对于内部,请将其保留为默认值 5

      • 在你完成时,选择保存

    • 完成后,请选择保存以保存入站规则。

  9. 选择“保存”以保存入站规则。 显示如何添加负载均衡规则的屏幕截图。

  10. 依次选择“查看 + 创建”、“创建”。

选择创建并部署 ILB 后,可以在负载均衡器列表中看到它,如以下屏幕截图所示。

显示你刚刚创建的新负载均衡器的屏幕截图。

使用 ILB 更新 DNS 服务器

使用内部 DNS 服务器为 ILB 创建 A 记录。 此设置可确保传输到 fs.contoso.com 的所有数据最终都使用适当的路由到达 ILB。 A 记录应用于联合身份验证服务,其 IP 地址指向 ILB 的 IP 地址。 例如,如果 ILB IP 地址为 10.3.0.8,安装的联合身份验证服务为 fs.contoso.com,则为 fs.contoso.com 创建一个指向 10.3.0.8 的 A 记录。

警告

如果正在为 AD FS 数据库使用 Windows 内部数据库 (WID),请将此值设置为暂时指向主 AD FS 服务器。 如果不进行此临时设置更改,Web 应用程序代理将无法注册。 成功注册所有 Web 应用程序代理服务器后,请更改此 DNS 条目以指向负载均衡器。

注意

如果部署也使用 IPv6,请创建相应的 AAAA 记录。

配置 Web 应用程序代理服务器以访问 AD FS 服务器

若要确保 Web 应用程序代理服务器能够访问 ILB 后面的 AD FS 服务器,请在 ILB 的 %systemroot%\system32\drivers\etc\hosts 文件中创建记录。 可分辨名称 (DN) 应为联合身份验证服务名称,例如 fs.contoso.com。 IP 条目应为 ILB 的 IP 地址,在本例中为 10.3.0.8。

警告

如果正在为 AD FS 数据库使用 Windows 内部数据库 (WID),请将此值设置为暂时指向主 AD FS 服务器。 否则,Web 应用程序代理将无法注册。 成功注册所有 Web 应用程序代理服务器后,请更改此 DNS 条目以指向负载均衡器。

安装 Web 应用程序代理角色

确保 Web 应用程序代理服务器能够访问 ILB 后面的 AD FS 服务器后,接下来可以安装 Web 应用程序代理服务器。 Web 应用程序代理服务器不需要加入域。 通过选择远程访问角色,在两个 Web 应用程序代理服务器上安装 Web 应用程序代理角色。 服务器管理器指导你完成 WAP 安装。

有关如何部署 WAP 的详细信息,请参阅安装和配置 Web 应用程序代理服务器

创建和部署面向 Internet 的(公共)负载均衡器

若要创建和部署面向 Internet 的负载均衡器,请执行以下操作:

  1. 在 Azure 门户中,选择“负载均衡器”,然后单击“创建”。

  2. 创建负载均衡器中,转到基本信息选项卡,并配置以下设置:

    • 在“项目详细信息”下

      • 对于订阅,请选择订阅的名称。

      • 对于资源组,请选择现有资源组,或选择新建以创建新资源组。

    • 在“实例详细信息”下:

      • 对于名称,请输入负载均衡器的名称。

      • 对于区域,选择要使用的区域。

      • 对于类型,请选择公共

    • SKU保留为默认值,然后选择“下一步:前端 IP 配置

    显示如何添加面向公众的负载均衡规则的屏幕截图。

  3. 选择“添加前端 IP 配置”,然后在“添加前端 IP 配置”页中输入或选择此信息。

    • 对于名称,输入前端 IP 配置名称。

    • 对于“IP 类型”,选择“IP 地址”。

    • 对于公共 IP 地址,请从下拉列表中选择要使用的公共 IP 地址,或选择创建以创建新的 IP 地址,然后选择添加

    显示如何在创建公共负载均衡器时添加前端 IP 配置的屏幕截图。

  4. 选择下一步:后端池,然后选择 + 添加后端池

  5. 添加后端池页上,在名称字段中输入后端池的名称。 在 IP 配置区域中,选择 + 添加

  6. 在“添加后端池”页上,选择要与后端池保持一致的 VM,选择“添加”,然后选择“保存”。 显示如何在创建公共负载均衡器时添加后端池的屏幕截图。

  7. 选择下一步:入站规则,然后选择添加负载均衡规则。 在添加负载均衡规则页面中,配置以下设置:

    • 对于名称,输入规则的名称。

    • 对于前端 IP 地址,请选择之前创建的地址。

    • 对于后端池,选择之前创建的后端池。

    • 对于“协议”,请选择“TCP”。

    • 对于“端口”,请输入 443。

    • 对于后端端口,请输入 443

    • 对于运行状况探测,请输入以下值:

      • 对于名称,输入运行状况探测的名称。

      • 对于协议,输入 HTTP

      • 对于端口,请输入 80

      • 对于路径,请输入 /adfs/probe

      • 对于内部,请将其保留为默认值 5

      • 在你完成时,选择保存

    • 完成后,请选择保存以保存入站规则。

  8. 依次选择“查看 + 创建”、“创建”。

选择创建并部署公共 ILB 后,它应包含负载均衡器的列表。

显示如何保存入站规则的屏幕截图。

向公共 IP 分配 DNS 标签

若要配置用于公共 IP 的 DNS 标签,请执行以下操作:

  1. 在 Azure 门户中,搜索公共 IP 地址,然后选择要编辑的 IP 地址。

  2. 在“设置”下,选择“配置”。

  3. 在“提供 DNS 标签(可选)”下,在解析为外部负载均衡器的 DNS 标签(如 contosofs.westus.cloudapp.azure.com)的文本字段中添加一个条目(如 fs.contoso.com)。

  4. 选择“保存”以完成 DNS 标签分配。

测试 AD FS 登录

测试 AD FS 的最简单方法是使用 IdpInitiatedSignOn.aspx 页。 为此,必须在 AD FS 属性上启用 IdpInitiatedSignOn。

若要检查是否已启用 IdpInitiatedSignOn 属性,请执行以下操作:

  1. 在 PowerShell 中,在 AD FS 服务器上运行以下 cmdlet 以将其设置为已启用。

    Set-AdfsProperties -EnableIdPInitiatedSignOnPage $true
    
  2. 从任何外部计算机访问 https:\//adfs-server.contoso.com/adfs/ls/IdpInitiatedSignon.aspx

  3. 你应该看到以下 AD FS 页面:

    测试登录页面的屏幕截图。

  4. 请尝试登录。 如果成功登录,你应该会看到出现一条消息,如下面的屏幕截图所示。

    显示测试成功消息的屏幕截图。

用于在 Azure 中部署 AD FS 的模板

该模板部署了一个六台计算机的设置,其中两台分别用于域控制器、AD FS 和 WAP。

在 Azure 部署模板中 AD FS

部署此模板时,可以使用现有虚拟网络或创建新的虚拟网络。 下表列出了可用于自定义部署的参数。

参数 说明
位置 要将资源部署到的区域。
StorageAccountType 要创建的存储帐户的类型。
VirtualNetworkUsage 指示是创建新的虚拟网络还是使用现有的虚拟网络。
VirtualNetworkName 虚拟网络的名称。 对现有或新的虚拟网络使用情况是必需的。
VirtualNetworkResourceGroupName 指定现有虚拟网络所在的资源组的名称。 使用现有虚拟网络时,此选项是必需参数,因此部署可以找到现有虚拟网络的 ID。
VirtualNetworkAddressRange 新虚拟网络的地址范围。 如果创建新的虚拟网络,则是必需的。
InternalSubnetName 内部子网的名称。 对于新的和现有的虚拟网络使用选项都是必需的。
InternalSubnetAddressRange 内部子网的地址范围,其中包含域控制器和 AD FS 服务器。 如果创建新的虚拟网络,则是必需的。
DMZSubnetAddressRange DMZ 子网的地址范围,其中包含 Windows 应用程序代理服务器。 如果创建新的虚拟网络,则是必需的。
DMZSubnetName 内部子网的名称,这对于新的和现有的虚拟网络使用选项都是必需的。
ADDC01NICIPAddress 第一个域控制器的内部 IP 地址。 此 IP 地址静态分配给 DC,并且必须是内部子网内的有效 IP 地址。
ADDC02NICIPAddress 第二个域控制器的内部 IP 地址。 此 IP 地址静态分配给 DC,并且必须是内部子网内的有效 IP 地址。
ADFS01NICIPAddress 第一台 AD FS 服务器的内部 IP 地址。 此 IP 地址静态分配给 AD FS 服务器,并且必须是内部子网内的有效 IP 地址。
ADFS02NICIPAddress 第二台 AD FS 服务器的内部 IP 地址。 此 IP 地址静态分配给 AD FS 服务器,并且必须是内部子网内的有效 IP 地址。
WAP01NICIPAddress 第一台 WAP 服务器的内部 IP 地址。 此 IP 地址静态分配给 WAP 服务器,并且必须是 DMZ 子网内的有效 IP 地址。
WAP02NICIPAddress 第二台 WAP 服务器的内部 IP 地址。 此 IP 地址静态分配给 WAP 服务器,并且必须是 DMZ 子网内的有效 IP 地址。
ADFSLoadBalancerPrivateIPAddress AD FS 负载均衡器的内部 IP 地址。 此 IP 地址静态分配给负载均衡器,并且必须是内部子网内的有效 IP 地址。
ADDCVMNamePrefix 域控制器的 VM 名称前缀。
ADFSVMNamePrefix AD FS 服务器的 VM 名称前缀。
WAPVMNamePrefix WAP 服务器的 VM 名称前缀。
ADDCVMSize 域控制器的 VM 大小。
ADFSVMSize AD FS 服务器的 VM 大小。
WAPVMSize WAP 服务器的 VM 大小。
AdminUserName VM 的本地管理员的名称。
AdminPassword VM 的本地管理员帐户的密码。

后续步骤