Windows Server 2012 通过引入复合身份验证来增强 Kerberos 身份验证。 复合身份验证使 Kerberos Ticket-Granting 服务 (TGS) 请求能够包含两个身份:
- 用户的身份
- 用户设备的身份。
Windows 通过扩展 Kerberos 灵活身份验证安全隧道 (FAST) 或 Kerberos 保护来完成复合身份验证。
AD FS 2012 及更高版本允许使用 AD DS 颁发的用户或设备声明,这些声明驻留在 Kerberos 身份验证票证中。 在早期版本的 AD FS 中,声明引擎只能从 Kerberos 读取用户和组安全 ID (SID),但无法读取 Kerberos 票证中包含的任何声明信息。
通过将 Active Directory 域服务 (AD DS) 颁发的用户和设备声明与 Active Directory 联合身份验证服务 (AD FS) 一起使用,可以为联合应用程序启用更丰富的访问控制。
要求
访问联合应用程序的计算机必须使用 Windows 集成身份验证向 AD FS 进行身份验证。
- Windows 集成身份验证仅在连接到后端 AD FS 服务器时可用。
- 计算机必须能够访问联合身份验证服务名称的后端 AD FS 服务器
- AD FS 服务器必须在其 Intranet 设置中提供 Windows 集成身份验证作为主要身份验证方法。
策略 Kerberos 客户端对声明复合身份验证和 Kerberos 保护的支持 必须应用于访问受复合身份验证保护的联合应用程序的所有计算机。 这适用于单林或跨林方案。
托管 AD FS 服务器的域必须将 KDC 支持声明复合身份验证和 Kerberos 保护 策略设置应用于域控制器。
在 Windows Server 2012 R2 中配置 AD FS 的步骤
使用以下步骤配置复合身份验证和声明
步骤 1:在默认域控制器策略上启用对声明、复合身份验证和 Kerberos 保护的 KDC 支持
- 在 Server Manager 中,依次选择 Tools 和 Group Policy Management。
- 向下导航到 Default Domain Controller Policy,右键单击并选择 edit。
- 在组策略管理编辑器的“计算机配置”下,依次展开“策略”、“管理模板”、“系统”,然后选择“KDC”。
- 在右窗格中,双击 KDC support for claims, compound authentication, and Kerberos armoring。
- 在新对话框窗口中,将 KDC support for claims (对声明的 KDC 支持) 设置为 Enabled (已启用)。
- 在 “选项” 下,从下拉菜单中选择 “支持 ”,然后单击 “应用 ” 和 “确定”。
步骤 2:在访问联合应用程序的计算机上启用 Kerberos 客户端对声明、复合身份验证和 Kerberos 保护的支持
- 在应用于访问联合应用程序的计算机的组策略上,在组策略管理编辑器的“计算机配置”下,依次展开“策略”、“管理模板”、“系统”,然后选择“Kerberos”。
- 在“组策略管理编辑器”窗口的右窗格中,双击“ Kerberos 客户端对声明、复合身份验证和 Kerberos 保护的支持”。
- 在新对话框窗口中,将 Kerberos client support (Kerberos 客户端支持) 设置为 Enabled (已启用 ),然后单击 Apply (应用 ) 和 OK ( 确定)。
- 关闭“组策略管理编辑器”。
步骤 3:确保 AD FS 服务器已更新。
您需要确保在 AD FS 服务器上安装了以下更新。
更新 | DESCRIPTION |
---|---|
KB2919355 | 累积安全更新(包括 KB2919355、KB2932046、KB2934018、KB2937592、KB2938439) |
KB2959977 | Server 2012 R2 更新 |
修补程序 3052122 | 此更新在 Active Directory 联合身份验证服务中添加了对复合 ID 声明的支持。 |
步骤 4:配置主身份验证提供程序
将 “主身份验证提供程序 ”设置为 “AD FS Intranet 的 Windows 身份验证 ”设置。
在 AD FS 管理中,在 “身份验证策略”下,选择 “主身份验证 ”,然后在 “全局设置 ”下单击 “编辑”。
在 Intranet 下的 Edit Global Authentication Policy 上,选择 Windows Authentication。
点击 使用 和 Ok.
使用 PowerShell,可以使用 Set-AdfsGlobalAuthenticationPolicy cmdlet。
Set-AdfsGlobalAuthenticationPolicy -PrimaryIntranetAuthenticationProvider 'WindowsAuthentication'
注释
在基于 WID 的场中,必须在主 AD FS 服务器上执行 PowerShell 命令。 在基于 SQL 的场中,PowerShell 命令可以在作为场成员的任何 AD FS 服务器上执行。
步骤 5:将声明说明添加到 AD FS
将以下 Claim Description (声明描述) 添加到场。 默认情况下,此声明说明在 AD FS 2012 R2 中不存在,需要手动添加。
在 AD FS 管理中的“服务”下,右键单击“声明说明”,然后选择“添加声明说明”
在索赔说明中输入以下信息
- 显示名称:“Windows 设备组”
- 索赔说明:
'<https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup>'
`
在两个框中都打勾。
单击 “确定” 。
使用 PowerShell,可以使用 Add-AdfsClaimDescription cmdlet。
Add-AdfsClaimDescription -Name 'Windows device group' -ClaimType 'https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup' ` -ShortName 'windowsdevicegroup' -IsAccepted $true -IsOffered $true -IsRequired $false -Notes 'The windows group SID of the device'
注释
在基于 WID 的场中,必须在主 AD FS 服务器上执行 PowerShell 命令。 在基于 SQL 的场中,PowerShell 命令可以在作为场成员的任何 AD FS 服务器上执行。
步骤 6:在 msDS-SupportedEncryptionTypes 属性上启用复合身份验证位
- 在指定用于使用 Set-ADServiceAccount PowerShell cmdlet 运行 AD FS 服务的帐户的 msDS-SupportedEncryptionTypes 属性上启用复合身份验证位。
注释
如果更改服务帐户,则必须通过运行 Set-ADUser -compoundIdentitySupported:$true Windows PowerShell cmdlet 来手动启用复合身份验证。
Set-ADServiceAccount -Identity “ADFS Service Account” -CompoundIdentitySupported:$true
- 重启 AD FS 服务。
注释
将“CompoundIdentitySupported”设置为 true 后,在新服务器 (2012R2/2016) 上安装相同的 gMSA 将失败,并显示以下错误 – Install-ADServiceAccount:无法安装服务帐户。错误消息:“提供的上下文与目标不匹配。
解决方案:暂时将 CompoundIdentitySupported 设置为 $false。 此步骤会导致 AD FS 停止发出 WindowsDeviceGroup 声明。 Set-ADServiceAccount -Identity“ADFS 服务帐户”-CompoundIdentitySupported:$false 在新服务器上安装 gMSA,然后启用 CompoundIdentitySupported 以返回到 $True。 禁用 CompoundIdentitySupported,然后重新启用不需要重启 AD FS 服务。
步骤 7:更新 Active Directory 的 AD FS 声明提供程序信任
- 更新 Active Directory 的 AD FS 声明提供程序信任,以包含“WindowsDeviceGroup”声明的以下“直通”声明规则。
- 在 AD FS 管理中,单击 “声明提供程序信任” ,然后在右窗格中右键单击“ Active Directory ”,然后选择 “编辑声明规则”。
- 在 Edit claim Rules for Active Director (编辑活动控制器的申请规则 ) 上,单击 Add Rule。
- 在 Add Transform Claim Rule Wizard (添加转换声明规则向导 ) 上,选择 Pass Through (传递) 或 Filter an Incoming Claim (筛选传入声明 ),然后单击 Next(下一步)。
- 添加显示名称,然后从 Incoming claim type (传入声明类型) 下拉列表中选择 Windows device group (Windows 设备组)。
- 单击“完成”。 点击 使用 和 Ok.
步骤 8:在需要“WindowsDeviceGroup”声明的信赖方上,添加类似的“直通”或“转换”声明规则。
- 在 AD FS 管理中,单击 “信赖方信任 ”,然后在右窗格中右键单击 RP 并选择 “编辑声明规则”。
- 在 Issuance Transform Rules (颁发转换规则) 上,单击 Add Rule (添加规则)。
- 在 Add Transform Claim Rule Wizard (添加转换声明规则向导 ) 上,选择 Pass Through (传递) 或 Filter an Incoming Claim (筛选传入声明 ),然后单击 Next(下一步)。
- 添加显示名称,然后从 Incoming claim type (传入声明类型) 下拉列表中选择 Windows device group (Windows 设备组)。
- 单击“完成”。 点击 使用 和 Ok.
在 Windows Server 2016 中配置 AD FS 的步骤
下面将详细介绍在 Windows Server 2016 的 AD FS 上配置复合身份验证的步骤。
步骤 1:在默认域控制器策略上启用对声明、复合身份验证和 Kerberos 保护的 KDC 支持
- 在 Server Manager 中,依次选择 Tools 和 Group Policy Management。
- 向下导航到 Default Domain Controller Policy,右键单击并选择 edit。
- 在组策略管理编辑器的“计算机配置”下,依次展开“策略”、“管理模板”、“系统”,然后选择“KDC”。
- 在右窗格中,双击 KDC support for claims, compound authentication, and Kerberos armoring。
- 在新对话框窗口中,将 KDC support for claims (对声明的 KDC 支持) 设置为 Enabled (已启用)。
- 在 “选项” 下,从下拉菜单中选择 “支持 ”,然后单击 “应用 ” 和 “确定”。
步骤 2:在访问联合应用程序的计算机上启用 Kerberos 客户端对声明、复合身份验证和 Kerberos 保护的支持
- 在应用于访问联合应用程序的计算机的组策略上,在组策略管理编辑器的“计算机配置”下,依次展开“策略”、“管理模板”、“系统”,然后选择“Kerberos”。
- 在“组策略管理编辑器”窗口的右窗格中,双击“ Kerberos 客户端对声明、复合身份验证和 Kerberos 保护的支持”。
- 在新对话框窗口中,将 Kerberos client support (Kerberos 客户端支持) 设置为 Enabled (已启用 ),然后单击 Apply (应用 ) 和 OK ( 确定)。
- 关闭“组策略管理编辑器”。
步骤 3:配置主身份验证提供程序
- 将 “主身份验证提供程序 ”设置为 “AD FS Intranet 的 Windows 身份验证 ”设置。
- 在 AD FS 管理中,在 “身份验证策略”下,选择 “主身份验证 ”,然后在 “全局设置 ”下单击 “编辑”。
- 在 Intranet 下的 Edit Global Authentication Policy 上,选择 Windows Authentication。
- 点击 使用 和 Ok.
- 使用 PowerShell,可以使用 Set-AdfsGlobalAuthenticationPolicy cmdlet。
Set-AdfsGlobalAuthenticationPolicy -PrimaryIntranetAuthenticationProvider 'WindowsAuthentication'
注释
在基于 WID 的场中,必须在主 AD FS 服务器上执行 PowerShell 命令。 在基于 SQL 的场中,PowerShell 命令可以在作为场成员的任何 AD FS 服务器上执行。
步骤 4:在 msDS-SupportedEncryptionTypes 属性上启用复合身份验证位
- 在指定用于使用 Set-ADServiceAccount PowerShell cmdlet 运行 AD FS 服务的帐户的 msDS-SupportedEncryptionTypes 属性上启用复合身份验证位。
注释
如果更改服务帐户,则必须通过运行 Set-ADUser -compoundIdentitySupported:$true Windows PowerShell cmdlet 来手动启用复合身份验证。
Set-ADServiceAccount -Identity “ADFS Service Account” -CompoundIdentitySupported:$true
- 重启 AD FS 服务。
注释
将“CompoundIdentitySupported”设置为 true 后,在新服务器 (2012R2/2016) 上安装相同的 gMSA 将失败,并显示以下错误 – Install-ADServiceAccount:无法安装服务帐户。错误消息:“提供的上下文与目标不匹配。
解决方案:暂时将 CompoundIdentitySupported 设置为 $false。 此步骤会导致 AD FS 停止发出 WindowsDeviceGroup 声明。 Set-ADServiceAccount -Identity“ADFS 服务帐户”-CompoundIdentitySupported:$false 在新服务器上安装 gMSA,然后启用 CompoundIdentitySupported 以返回到 $True。 禁用 CompoundIdentitySupported,然后重新启用不需要重启 AD FS 服务。
步骤 5:更新 Active Directory 的 AD FS 声明提供程序信任
- 更新 Active Directory 的 AD FS 声明提供程序信任,以包含“WindowsDeviceGroup”声明的以下“直通”声明规则。
- 在 AD FS 管理中,单击 “声明提供程序信任” ,然后在右窗格中右键单击“ Active Directory ”,然后选择 “编辑声明规则”。
- 在 Edit claim Rules for Active Director (编辑活动控制器的申请规则 ) 上,单击 Add Rule。
- 在 Add Transform Claim Rule Wizard (添加转换声明规则向导 ) 上,选择 Pass Through (传递) 或 Filter an Incoming Claim (筛选传入声明 ),然后单击 Next(下一步)。
- 添加显示名称,然后从 Incoming claim type (传入声明类型) 下拉列表中选择 Windows device group (Windows 设备组)。
- 单击“完成”。 点击 使用 和 Ok.
步骤 6:在需要“WindowsDeviceGroup”声明的信赖方上,添加类似的“直通”或“转换”声明规则。
- 在 AD FS 管理中,单击 “信赖方信任 ”,然后在右窗格中右键单击 RP 并选择 “编辑声明规则”。
- 在 Issuance Transform Rules (颁发转换规则) 上,单击 Add Rule (添加规则)。
- 在 Add Transform Claim Rule Wizard (添加转换声明规则向导 ) 上,选择 Pass Through (传递) 或 Filter an Incoming Claim (筛选传入声明 ),然后单击 Next(下一步)。
- 添加显示名称,然后从 Incoming claim type (传入声明类型) 下拉列表中选择 Windows device group (Windows 设备组)。
- 单击“完成”。 点击 使用 和 Ok.
验证
若要验证“WindowsDeviceGroup”声明的发布,请使用 .Net 4.6 创建一个测试声明感知应用程序。 使用 WIF SDK 4.0。
在 AD FS 中将应用程序配置为信赖方,并使用上述步骤中指定的声明规则对其进行更新。
使用 AD FS 的 Windows 集成身份验证提供程序对应用程序进行身份验证时,将创建以下声明。
现在可以使用计算机/设备的声明进行更丰富的访问控制。
例如,以下 AdditionalAuthenticationRules 指示 AD FS 在以下情况下调用 MFA:身份验证用户不是安全组“-1-5-21-2134745077-1211275016-3050530490-1117”的成员,并且计算机(用户进行身份验证的位置)不是安全组“S-1-5-21-2134745077-1211275016-3050530490-1115 (WindowsDeviceGroup)”的成员
但是,如果满足上述任何条件,请不要调用 MFA。
'NOT EXISTS([Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup", Value =~ "S-1-5-21-2134745077-1211275016-3050530490-1115"])
&& NOT EXISTS([Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value =~ "S-1-5-21-2134745077-1211275016-3050530490-1117"])
=> issue(Type = "https://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", Value = "https://schemas.microsoft.com/claims/multipleauthn");'