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

使用 AD FS 为 Azure 虚拟桌面配置单一登录

本文将指导你完成为 Azure 虚拟桌面配置 Active Directory 联合身份验证服务 (AD FS) 单一登录 (SSO) 的过程。

先决条件

在配置 AD FS 单一登录之前,必须在环境中运行以下设置:

  • 运行受支持版本的 Windows 10 或 Windows 11 的会话主机。

  • 必须部署 Active Directory 证书服务 (CA) 角色。 运行该角色的所有服务器都必须已加入域,安装最新的 Windows 更新,并配置为 企业证书颁发机构

  • 必须部署 Active Directory 联合身份验证服务 (AD FS) 角色。 运行此角色的所有服务器都必须已加入域,已安装最新的 Windows 更新,并且运行Windows Server 2016或更高版本。 请参阅 联合身份验证教程 ,开始设置此角色。

  • 建议设置 Web 应用程序代理 角色,以保护环境与 AD FS 服务器的连接。 运行此角色的所有服务器都必须安装最新的 Windows 更新,并且运行Windows Server 2016或更高版本。 请参阅此 Web 应用程序代理指南,开始设置此角色。

  • 必须部署 Microsoft Entra Connect 才能将用户同步到Microsoft Entra ID。 Microsoft Entra Connect 必须在联合模式下配置。

  • 在 AD FS 服务器上为 Azure 虚拟桌面设置 PowerShell 环境

注意

Microsoft Entra 域服务不支持此解决方案。 必须使用Active Directory 域服务域控制器。

支持的客户端

以下 Azure 虚拟桌面客户端支持此功能:

配置证书颁发机构以颁发证书

必须正确创建以下证书模板,以便 AD FS 可以使用 SSO:

  • 首先,需要创建 Exchange 注册代理 (脱机请求) 证书模板。 AD FS 使用 Exchange 注册代理证书模板代表用户请求证书。
  • 还需要创建 智能卡登录 证书模板,AD FS 将使用该模板创建登录证书。

创建这些证书模板后,需要在证书颁发机构上启用模板,以便 AD FS 可以请求它们。

注意

每次用户登录时,此解决方案都会生成新的短期证书,如果有多个用户,该证书可能会填满证书颁发机构数据库。 可以通过 为非持久性证书处理设置 CA 来避免数据库过载。 如果执行此作,请在复制的智能卡登录证书模板上,确保仅在 CA 数据库中启用“不存储证书和请求”。 不要启用 “不要在颁发的证书中包含吊销信息 ”,否则配置将不起作用。

创建注册代理证书模板

根据你的环境,你可能已经配置了注册代理证书模板,用于其他用途,例如Windows Hello 企业版、登录证书或 VPN 证书。 如果是这样,则需要修改它以支持 SSO。 如果没有,可以创建新模板。

若要确定是否已在使用注册代理证书模板,请在 AD FS 服务器上运行以下 PowerShell 命令,并查看是否返回了值。 如果为空,请创建新的注册代理证书模板。 否则,请记住名称并更新现有注册代理证书模板。

Import-Module adfs
(Get-AdfsCertificateAuthority).EnrollmentAgentCertificateTemplateName

创建新的注册代理证书模板:

  1. 在证书颁发机构中,从“开始”菜单运行 mmc.exe 以启动 Microsoft管理控制台

  2. 选择 “文件...”>添加/远程管理单元...>证书模板>加 >>确定 查看证书模板列表。

  3. 展开 “证书模板”,右键单击“ Exchange 注册代理 (脱机请求) 并选择” 复制模板”。

  4. 选择“ 常规 ”选项卡,然后在“ 模板显示名称 ”字段中输入“ADFS 注册代理”。 这会自动将模板名称设置为“ADFSEnrollmentAgent”。

  5. 选择“ 安全性 ”选项卡,然后选择“ 添加...”

  6. 接下来,依次选择“ 对象类型...”“服务帐户”和 “确定”。

  7. 输入 AD FS 的服务帐户名称,然后选择“ 确定”。

    • 在独立的 AD FS 设置中,服务帐户将命名为“adfssvc$”
    • 如果使用 Microsoft Entra Connect 设置 AD FS,服务帐户将命名为“aadcsvc$”
  8. 添加服务帐户并在“安全性”选项卡中可见后,在“组或用户名”窗格中将其选中,在“AD FS 服务帐户的权限”窗格中选择“允许”和“自动注册”,然后选择“确定”进行保存。

    显示正确配置注册代理证书模板后的安全选项卡的屏幕截图。

若要更新现有注册代理证书模板,请执行以下作:

  1. 在证书颁发机构中,从“开始”菜单运行 mmc.exe 以启动 Microsoft管理控制台
  2. 选择 “文件...”>添加/远程管理单元...>证书模板>加 >>确定 查看证书模板列表。
  3. 展开 “证书模板”,双击与 AD FS 服务器上配置的模板对应的模板。 在“ 常规 ”选项卡上,模板名称应与上面找到的名称匹配。
  4. 选择“ 安全性 ”选项卡,然后选择“ 添加...”
  5. 接下来,依次选择“ 对象类型...”“服务帐户”和 “确定”。
  6. 输入 AD FS 的服务帐户名称,然后选择“ 确定”。
    • 在独立的 AD FS 设置中,服务帐户将命名为“adfssvc$”
    • 如果使用 Microsoft Entra Connect 设置 AD FS,服务帐户将命名为“aadcsvc$”
  7. 添加服务帐户并在“安全性”选项卡中可见后,在“组或用户名”窗格中将其选中,在“AD FS 服务帐户的权限”窗格中选择“允许”和“自动注册”,然后选择“确定”进行保存。

创建智能卡登录证书模板

创建智能卡登录证书模板:

  1. 在证书颁发机构中,从“开始”菜单运行 mmc.exe 以启动 Microsoft管理控制台

  2. 选择 “文件...”>添加/远程管理单元...>证书模板>>确定 查看证书模板列表。

  3. 展开 “证书模板”,右键单击“ 智能卡登录 ”,然后选择“ 复制模板”。

  4. 选择“ 常规 ”选项卡,然后在“ 模板显示名称 ”字段中输入“ADFS SSO”。 这会自动将模板名称设置为“ADFSSSO”。

    注意

    由于此证书是按需请求的,因此建议将有效期缩短到 8 小时,将续订期缩短到 1 小时。

  5. 选择“ 使用者名称 ”选项卡,然后在 请求中选择“提供”。 看到警告消息时,请选择“ 确定”。

    显示 SSO 证书模板的“使用者名称”选项卡的屏幕截图,以及正确配置后的外观。

  6. 选择“ 颁发要求 ”选项卡。

  7. 选择“ 此授权签名数” ,并输入值 1

    显示 SSO 证书模板的“颁发要求”选项卡的屏幕截图,以及正确配置后的外观。

  8. 对于 “应用程序策略”,选择“ 证书请求代理”。

  9. 选择“ 安全性 ”选项卡,然后选择“ 添加...”

  10. 选择 “对象类型...”“服务帐户”“确定”。

  11. 输入 AD FS 的服务帐户名称,就像 在创建注册代理证书模板 部分中所做的那样。

    • 在独立的 AD FS 设置中,服务帐户将命名为“adfssvc$”
    • 如果使用 Microsoft Entra Connect 设置 AD FS,服务帐户将命名为“aadcsvc$”
  12. 添加服务帐户并在“ 安全 ”选项卡中可见后,在“ 组或用户名 ”窗格中选择它,为“注册”和“自动注册”选择 “允许 ”,然后选择 “确定 ”进行保存。

显示正确配置 SSO 证书模板后的安全选项卡的屏幕截图。

启用新的证书模板:

若要启用新的证书模板,请执行以下作:

  1. 在证书颁发机构中,从“开始”菜单运行 mmc.exe 以启动 Microsoft管理控制台

  2. 选择 “文件...”>添加/删除管理单元...>证书颁发机构>加 >>完成> 和 “确定” 查看证书颁发机构。

  3. 展开左侧窗格中的“证书颁发机构”,然后打开 “证书模板”。

  4. 右键单击显示证书模板列表的中间窗格,选择“ 新建”,然后选择“ 要颁发的证书模板”。

  5. 同时选择 ADFS 注册代理ADFS SSO,然后选择 “确定”。 应在中间窗格中看到这两个模板。

    显示可颁发的证书模板列表的屏幕截图,包括新的 ADFS 注册代理和 ADFS SSO。

    注意

    如果已配置注册代理证书模板,则只需添加 ADFS SSO 模板。

配置 AD FS 服务器

必须将Active Directory 联合身份验证服务 (AD FS) 服务器配置为使用新的证书模板,并将信赖方信任设置为支持 SSO。

AD FS 服务器与 Azure 虚拟桌面服务之间的信赖方信任允许将单一登录证书请求正确转发到域环境。

配置 AD FS 单一登录时,必须选择共享密钥或证书:

  • 如果你有单个 AD FS 服务器,则可以选择共享密钥或证书。
  • 如果有多个 AD FS 服务器,则需要选择证书。

用于生成用于登录 Windows 的令牌的共享密钥或证书必须安全地存储在 Azure 密钥保管库中。 可以将机密存储在现有密钥保管库中,也可以部署新机密。 无论哪种情况,都必须确保设置正确的访问策略,以便 Azure 虚拟桌面服务可以访问它。

使用证书时,可以使用任何常规用途证书,并且不要求使用者名称或使用者可选名称 (SAN) 。 虽然不是必需的,但建议创建由有效证书颁发机构颁发的证书。 此证书可以直接在 Azure 密钥保管库中创建,并且需要具有可导出的私钥。 可以使用以下脚本导出公钥并用于配置 AD FS 服务器。 请注意,此证书不同于 AD FS SSL 证书,该证书必须具有正确的使用者名称和有效的证书颁发机构。

PowerShell 库中提供的 PowerShell 脚本 ConfigureWVDSSO.ps1将为信赖方信任配置 AD FS 服务器,并根据需要安装证书。

此脚本只有一个必需的参数 ADFSAuthority,该参数是解析为 AD FS 并使用“/adfs”作为后缀的 URL。 例如,https://adfs.contoso.com/adfs

  1. 在 AD FS VM 上,运行以下 PowerShell cmdlet,将 AD FS 配置为使用上一部分中的证书模板:

    Set-AdfsCertificateAuthority -EnrollmentAgentCertificateTemplate "ADFSEnrollmentAgent" -LogonCertificateTemplate "ADFSSSO" -EnrollmentAgent
    

    注意

    如果已配置 EnrollmentAgentCertificateTemplate,请确保使用现有模板名称而不是 ADFSEnrollmentAgent。

  2. 运行 ConfigureWVDSSO.ps1 脚本。

    注意

    需要 $config 变量值才能完成指令的下一部分,因此不要关闭用于完成上述说明的 PowerShell 窗口。 可以继续使用同一个 PowerShell 窗口,也可以在启动新的 PowerShell 会话时将其保持打开状态。

    • 如果在密钥保管库中使用共享密钥,请在 AD FS 服务器上运行以下 PowerShell cmdlet,并将 ADFSServiceUrl 替换为完整 URL,以访问 AD FS 服务:

      Install-Script ConfigureWVDSSO
      $config = ConfigureWVDSSO.ps1 -ADFSAuthority "<ADFSServiceUrl>" [-WvdWebAppAppIDUri "<WVD Web App URI>"] [-RdWebURL "<RDWeb URL>"]
      

      注意

      需要 WvdWebAppAppIDUri 和 RdWebURL 属性才能在主权云(如 Azure 政府)中配置环境。 在 Azure 商业云中,这些属性自动分别设置为 https://www.wvd.microsoft.comhttps://rdweb.wvd.microsoft.com

    • 如果在密钥保管库中使用证书,请在 AD FS 服务器上运行以下 PowerShell cmdlet,并将 ADFSServiceUrl 替换为完整 URL,以访问 AD FS 服务:

      Install-Script ConfigureWVDSSO
      $config = ConfigureWVDSSO.ps1 -ADFSAuthority "<ADFSServiceUrl>" -UseCert -CertPath "<Path to the pfx file>" -CertPassword <Password to the pfx file> [-WvdWebAppAppIDUri "<WVD Web App URI>"] [-RdWebURL "<RDWeb URL>"]
      

      注意

      需要 WvdWebAppAppIDUri 和 RdWebURL 属性才能在主权云(如 Azure 政府)中配置环境。 在 Azure 商业云中,这些属性自动分别设置为 https://www.wvd.microsoft.comhttps://rdweb.wvd.microsoft.com

  3. 通过运行以下 PowerShell cmdlet,在 Azure 密钥保管库上设置访问策略:

    Set-AzKeyVaultAccessPolicy -VaultName "<Key Vault Name>" -ServicePrincipalName 9cdead84-a844-4324-93f2-b2e6bb768d07 -PermissionsToSecrets get -PermissionsToKeys sign
    
  4. 使用标记将共享密钥或证书存储在 Azure 密钥保管库中,其中包含允许使用该机密的订阅 ID 的昏迷分隔列表。

    • 如果在密钥保管库中使用共享密钥,请运行以下 PowerShell cmdlet 来存储共享密钥并设置 标记:

      $hp = Get-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>" 
      $secret = Set-AzKeyVaultSecret -VaultName "<Key Vault Name>" -Name "adfsssosecret" -SecretValue (ConvertTo-SecureString -String $config.SSOClientSecret  -AsPlainText -Force) -Tag @{ 'AllowedWVDSubscriptions' = $hp.Id.Split('/')[2]}
      
    • 如果证书已在密钥保管库中,请运行以下 PowerShell cmdlet 以设置 标记:

      $hp = Get-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>"
      $secret = Update-AzKeyVaultCertificate -VaultName "<Key Vault Name>" -Name "<Certificate Name>" -Tag @{ 'AllowedWVDSubscriptions' = $hp.Id.Split('/')[2]} -PassThru
      
    • 如果你有本地证书,请运行以下 PowerShell cmdlet 以在密钥保管库中导入证书并设置 标记:

      $hp = Get-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>" 
      $secret = Import-AzKeyVaultCertificate -VaultName "<Key Vault Name>" -Name "adfsssosecret" -Tag @{ 'AllowedWVDSubscriptions' = $hp.Id.Split('/')[2]} -FilePath "<Path to pfx>" -Password (ConvertTo-SecureString -String "<pfx password>"  -AsPlainText -Force)
      

注意

可以选择通过更改 AD FS 单一登录设置来配置提示用户输入凭据的频率。 默认情况下,将在未注册的设备上每 8 小时提示用户一次。

配置 Azure 虚拟桌面主机池

是时候在 Azure 虚拟桌面主机池上配置 AD FS SSO 参数了。 为此,请为 Azure 虚拟桌面 设置 PowerShell 环境 (如果尚未设置)并连接到帐户。

之后,通过在 AD FS VM 的同一 PowerShell 窗口中运行以下两个 cmdlet 之一来更新主机池的 SSO 信息:

  • 如果在密钥保管库中使用共享密钥,请运行以下 PowerShell cmdlet:

    Update-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>" -SsoadfsAuthority "<ADFSServiceUrl>" -SsoClientId "<WVD Web App URI>" -SsoSecretType SharedKeyInKeyVault -SsoClientSecretKeyVaultPath $secret.Id
    

    注意

    需要设置 SsoClientId 属性,以匹配要部署 SSO 的 Azure 云。 在 Azure 商业云中,此属性应设置为 https://www.wvd.microsoft.com。 但是,对于其他云(如 Azure 政府 云),此属性的必需设置将有所不同。

  • 如果在密钥保管库中使用证书,请运行以下 PowerShell cmdlet:

    Update-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>" -SsoadfsAuthority "<ADFSServiceUrl>" -SsoClientId "<WVD Web App URI>" -SsoSecretType CertificateInKeyVault -SsoClientSecretKeyVaultPath $secret.Id
    

    注意

    需要设置 SsoClientId 属性,以匹配要部署 SSO 的 Azure 云。 在 Azure 商业云中,此属性应设置为 https://www.wvd.microsoft.com。 但是,对于其他云(如 Azure 政府 云),此属性的必需设置将有所不同。

配置其他主机池

需要配置其他主机池时,可以检索用于配置现有主机池的设置,以设置新主机池。

若要从现有主机池检索设置,请打开 PowerShell 窗口并运行此 cmdlet:

Get-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>" | fl *

可以按照步骤使用相同的 SsoClientIdSsoClientSecretKeyVaultPathSsoSecretTypeSsoadfsAuthority配置 Azure 虚拟桌面主机池

删除 SSO

若要在主机池上禁用 SSO,请运行以下 cmdlet:

Update-AzWvdHostPool -Name "<Host Pool Name>" -ResourceGroupName "<Host Pool Resource Group Name>" -SsoadfsAuthority ''

如果还想要在 AD FS 服务器上禁用 SSO,请运行以下 cmdlet:

Install-Script UnConfigureWVDSSO
UnConfigureWVDSSO.ps1 -WvdWebAppAppIDUri "<WVD Web App URI>" -WvdClientAppApplicationID "a85cf173-4192-42f8-81fa-777a763e6e2c"

注意

WvdWebAppAppIDUri 属性需要与要部署的 Azure 云相匹配。 在 Azure 商业云中,此属性为 https://www.wvd.microsoft.com。 对于其他云(如 Azure 政府 云)而言,它将有所不同。

后续步骤

配置单一登录后,可以登录到受支持的 Azure 虚拟桌面客户端,以在用户会话中对其进行测试。 若要了解如何使用新凭据连接到会话,检查以下文章: