Azure Virtual Desktop-7-利用ADFS实现SSO单点登录-共享密钥标识

网友投稿 264 2022-09-30

Azure Virtual Desktop-7-利用ADFS实现SSO单点登录-共享密钥标识

之前的文章给大家介绍了如何部署Azure Virtual Desktop简称AVD,那么这篇文章将给大家介绍如何利用ADFS构建AVD的SSO单点登录,参考资料:AD FS 单一登录之前,你的环境中必须已在运行以下设置:

必须部署 Active Directory 证书服务 (CA) 角色。 运行该角色的所有服务器必须已加入域、已安装最新的 Windows 更新,并已配置为​​企业证书颁发机构​​。必须部署“Active Directory 联合身份验证服务 (AD FS)”角色。 运行此角色的所有服务器都必须已加入域,已安装最新的 Windows 更新,并运行 Windows Server 2016 或更高版本。 若要开始设置此角色,请参阅我们的​​联合身份验证教程​​。建议设置 Web 应用程序代理角色,以保护环境与 AD FS 服务器的连接。 运行此角色的所有服务器必须已安装最新的 Windows 更新,并运行 Windows Server 2016 或更高版本。 请参阅此 ​​Web 应用程序代理指南​​开始设置此角色。必须部署 Azure AD Connect 以将用户同步到 Azure AD。 必须在​​联合模式​​下配置 Azure AD Connect。在 AD FS 服务器上为 Azure 虚拟桌面​​设置 PowerShell 环境 ​​。使用 Windows 10 20H1 或 20H2 连接到 Azure 虚拟桌面时,必须安装 Windows 10 的 2021-04 累积更新 (KB5001330) 或更高版本才能使单一登录正常运行。

备注:Azure AD 域服务不支持此解决方案。 必须使用一个 Active Directory 域控制器。

支持的客户端为:

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

​​Windows 桌面客户端​​​​Windows 64-bit ​​​​Windows 32-bit ​​​​Windows ARM64 ​​WEB​​客户端​​

结合以上官方的要求,我的实验环境将在之前的基础上做如下设置:

DC00上安装企业内部证书颁发机构CA(生产环境建议单独一台CA服务器);新建一台Windows Server 2016的ADFS服务器并设置ADFS的DNS指向DC00然后加域成为域成员服务器

安装角色服务

开始安装

安装完成开始配置

勾选如图所示下一步

选择企业

选择根

选择新的私钥

下一步

下一步

下一步

下一步

配置

完成,关闭

创建一个服务账户aadcsvc,设置该账户密码永不过期且不能修改密码

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

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

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

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

备注:每次用户登录时,此解决方案都会生成新的短期证书,如果存在大量用户,则一段时间后,可能会填满证书颁发机构数据库。 ​​设置一个 CA 用于非持久证书处理​​可以避免此问题。

创建注册代理证书模板

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

Import-Module adfs

(Get-AdfsCertificateAuthority).EnrollmentAgentCertificateTemplateName

创建新的注册代理证书模板,请执行以下操作:

打开证书颁发机构控制台,证书模板右键管理

展开“证书模板”,右键单击“Exchange 注册代理(脱机请求)”并选择“复制模板” 。选择“常规”选项卡,然后在“模板显示名称”字段中输入“ADFS 注册代理” 。 这会自动将模板名称设置为“ADFSEnrollmentAgent”。

选择“安全性”选项卡,然后选择“添加...” 。接下来,依次选择“对象类型...”、“服务帐户”、“确定” 。输入 AD FS 的服务帐户名称“aadcsvc$”,然后选择“确定”。在添加了服务帐户并且它在“安全性”选项卡中可见之后,请在“组或用户名”窗格中将它选中,在“AD FS 服务帐户的权限”窗格中对“注册”和“自动注册”都选择“允许”,然后选择“确定”以保存

创建“智能卡登录”证书模板

展开“证书模板”,右键单击“智能卡登录”并选择“复制模板” 。选择“常规”选项卡,然后在“模板显示名称”字段中输入“ADFS SSO” 。 这会自动将模板名称设置为“ADFSSSO”。 备注:由于此证书是按需请求的,因此我们建议将有效期缩短为 8 小时,将续订期缩短为 1 小时。

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

选择“颁发要求”选项卡,选择“此数量的已授权签名”并输入值 1 ;对于“应用程序策略”,请选择“证书请求代理”

选择“安全性”选项卡,然后选择“添加...” ,依次选择“对象类型...”、“服务帐户”、“确定” ,输入 AD FS 的服务帐户名称“aadcsvc$”;在添加了服务帐户并且它在“安全性”选项卡中可见之后,请在“组或用户名”窗格中将它选中,对“注册”和“自动注册”都选择“允许”,然后选择“确定”以保存 。

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

Azure密钥保管库配置

ADFS服务器安装AD FS角色

安装完成后配置 ADFS

下一步

下一步

在这里一定要使用公网证书才能配置SSO成功,比如使用通配符证书:*.basehome.com.cn;我这里测试环境单ADFS服务器使用的是单域名公网证书adfs.basehome.com.cn(不使用公网证书,将无法实现SSO)

下一步

下一步

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

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

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

如果只有一个 AD FS 服务器,则可以选择共享密钥或证书。如果有多个 AD FS 服务器,则必须选择证书。

用于生成 Windows 登录令牌的共享密钥或证书必须安全存储在 ​​Azure 密钥保管库​​中。可将秘钥存储在现有的密钥保管库中,或者部署新的密钥保管库。 无论采取哪种做法,都必须确保设置正确的访问策略,使 Azure 虚拟桌面服务能够访问该秘钥。

使用证书时,可以使用任何常规用途证书,并且在使用者名称或使用者可选名称 (SAN) 方面没有要求。尽管不一定非要这样做,但建议创建由有效证书颁发机构颁发的证书。 此证书可以直接在 Azure 密钥保管库中创建,需要包含可导出的私钥。 可使用以下脚本导出公钥并使用它来配置 ADFS 服务器。 请注意,此证书不同于 ADFS SSL 证书,后者必须具有正确的使用者名称和有效的证书颁发机构。

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

此脚本只有一个必需的参数 ADFSAuthority,此参数是解析为你的 ADFS 并使用“/adfs”作为后缀的 URL。 例如 ​​[Net.SecurityProtocolType]::Tls12

Install-PackageProvider-Name NuGet -MinimumVersion 2.8.5.201 -Force

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

域名注册机构注册好adfs.basehome.com.cn指向adfs服务器的公网ip地址A记录,并且adfs的公网ip需要开放443端口运行 ConfigureWVDSSO.ps1 脚本。 备注:需要指定 $config 变量值才能完成说明的下一部分,因此请不要关闭完成前面的说明时所用的 PowerShell 窗口。 可以继续使用同一个 PowerShell 窗口,或者在启动新的 PowerShell 会话时将此窗口保持打开状态。

这里在密钥保管库中使用共享秘钥(因为我这里只有1台ADFS服务器),请在 ADFS 服务器上运行以下 PowerShell cmdlet,将 ADFSServiceUrl 替换为完整 URL 以访问 AD FS 服务:

PowerShell:

Install-ScriptConfigureWVDSSO

$config =ConfigureWVDSSO.ps1 -ADFSAuthority "" [-WvdWebAppAppIDUri ""] [-RdWebURL ""]

例如:

Install-Script-Name ConfigureWVDSSO -Force

$config= ConfigureWVDSSO.ps1 -ADFSAuthority "​​​​​ ​​"​​​​​​​​ ​​"​​​​​​​​ ​​WvdWebAppAppIDUri 和 RdWebURL 属性来配置主权云(如 Azure 政府)中的环境。 在 Azure 商业云中,这些属性分别自动设置为 ​​Az

运行以下 PowerShell cmdlet 对 Azure 密钥保管库设置访问策略: PowerShell执行

先登录Azure

Connect-AzAccount

国内版是Connect-AzAccount-EnvironmentName azurechinacloud

Set-AzKeyVaultAccessPolicy -VaultName"" -ServicePrincipalName9cdead84-a844-4324-93f2-b2e6bb768d07 -PermissionsToSecretsget -PermissionsToKeyssign

例如:

Set-AzKeyVaultAccessPolicy-VaultName "hk-key-vault" -ServicePrincipalName 9cdead84-a844-4324-93f2-b2e6bb768d07 -PermissionsToSecrets get -PermissionsToKeys sign

验证密钥保管库下的权限

将共享密钥或证书存储在 Azure 密钥保管库中并为其设置一个标记,该标记包含有权使用该机密的订阅 ID 的逗号分隔列表。

如果使用密钥保管库中的共享密钥,请运行以下 PowerShell cmdlet 来存储共享密钥并设置标记: $hp= Get-AzWvdHostPool -Name"" -ResourceGroupName"" $secret= Set-AzKeyVaultSecret -VaultName"" -Name"adfsssosecret" -SecretValue(ConvertTo-SecureString -String$config.SSOClientSecret  -AsPlainText -Force) -Tag@{ 'AllowedWVDSubscriptions'= $hp.Id.Split('/')[2]}

例如:

$hp =Get-AzWvdHostPool -Name "UKSouth-HostSharePools" -ResourceGroupName "UK-South-RG"

$secret= Set-AzKeyVaultSecret -VaultName "hk-key-vault" -Name "adfsssosecret" -SecretValue (ConvertTo-SecureString -String $config.SSOClientSecret   -AsPlainText-Force) -Tag @{ 'AllowedWVDSubscriptions' = $hp.Id.Split('/')[2]}

若要验证Key Vault 中的机密,请浏览到 Key Vault-Secret

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

配置 Azure 虚拟桌面主机池

现在需要在 Azure 虚拟桌面主机池中配置 AD FS SSO 参数。 为此,请为 Azure 虚拟桌面​​设置 PowerShell 环境​​(如果尚未这样做)并连接到你的帐户。

Install-Module -NameAz.DesktopVirtualization

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

如果使用密钥保管库中的共享密钥,请运行以下 PowerShell cmdlet: Update-AzWvdHostPool -Name"" -ResourceGroupName"" -SsoadfsAuthority"" -SsoClientId"" -SsoSecretTypeSharedKeyInKeyVault -SsoClientSecretKeyVaultPath$secret.Id

例如:

Update-AzWvdHostPool -Name"UKSouth-HostSharePools" -ResourceGroupName "UK-South-RG" -SsoadfsAuthority " ​​-SsoClientId "​​-SsoSecretType SharedKeyInKeyVault-SsoClientSecretKeyVaultPath $secret.Id

备注:需要设置 SsoClientId 属性,使之与部署 SSO 的 Azure 云相匹配。 在 Azure 商业云中,此属性应设置为 ​​但是,此属性所需的设置对于其他云(如 Azure 政府云)会有所不同。​​

要验证,请运行以下命令并检查参数

Get-AzWvdHostPool-Name "UKSouth-HostSharePools" -ResourceGroupName "UK-South-RG" | fl *

大功告成,然后就可以测试下了

浏览器登录或Windows Desktop client登录启动 AVD,第一次会弹出ADFS身份验证对话框,但不会再弹出Windows身份验证对话框(除非ADFS验证不通过,才会再弹出Windows身份验证对话框),然后进入桌面

与此同时也可以在证书颁发机构中看到登录的这些账户自动注册了SSO的证书

满足以上效果就代表利用ADFS实现AVD的SSO开始生效了,那么接下来会有2种情况发生:

至此为AVD配置ADFS的SSO就配置完成了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用JPA插入枚举类型字段
下一篇:C++my_auto_ptr类
相关文章

 发表评论

暂时没有评论,来抢沙发吧~