使用 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 服务帐户的权限”窗格中对“注册”和“自动注册”都选择“允许”,然后选择“确定”以保存 。

    A screenshot showing the security tab of the Enrollment Agent certificate template after it is properly configured.

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

  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. 选择“使用者名称”选项卡,然后选择“在请求中提供” 。 看到警告消息时,选择“确定”。

    A screenshot showing the subject name tab of the SSO certificate template and what it should look like when properly configured.

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

  7. 选择“此数量的已授权签名”并输入值 1 。

    A screenshot showing the issuance requirements tab of the SSO certificate template and what it should look like when properly configured.

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

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

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

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

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

A screenshot showing the security tab of the SSO certificate template after it is properly configured.

启用新证书模板:

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

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

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

  3. 在左侧窗格中展开“证书颁发机构”并打开“证书模板”。

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

  5. 选择“ADFS 注册代理”和“ADFS SSO”,然后选择“确定” 。 中间窗格中应会显示这两个模板。

    A screenshot showing list of certificate templates that can be issued, including the new ADFS Enrollment Agent and 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 替换为用于访问 AD FS 服务的完整 URL):

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

      注意

      需要使用 WvdWebAppAppIDUri 和 RdWebURL 属性在由世纪互联运营的 Microsoft Azure 等主权云中配置环境。 在由世纪互联运营的 Microsoft Azure 中,这些属性分别自动设置为 https://www.wvd.azure.cnhttps://rdweb.wvd.azure.cn

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

      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 属性在由世纪互联运营的 Microsoft Azure 等主权云中配置环境。 在由世纪互联运营的 Microsoft Azure 中,这些属性分别自动设置为 https://www.wvd.azure.cnhttps://rdweb.wvd.azure.cn

  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 云相匹配。 在由世纪互联运营的 Microsoft Azure中,此属性应设置为 https://www.wvd.azure.cn

  • 如果使用密钥保管库中的证书,请运行以下 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 云相匹配。 在由世纪互联运营的 Microsoft Azure中,此属性应设置为 https://www.wvd.azure.cn

配置其他主机池

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

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

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

可以遵循配置 Azure 虚拟桌面主机池的步骤并使用相同的 SsoClientId、SsoClientSecretKeyVaultPath、SsoSecretType 和 SsoadfsAuthority 值进行操作 。

删除 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 云相匹配。 由世纪互联运营的 Microsoft Azure,此属性为 https://www.wvd.azure.cn

后续步骤

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