如何通过ADFS声明释放Active Directory中标记为机密的属性
机密属性标记下ADFS无法释放Employee-Number属性的解决方案
根因说明
- UAC过滤令牌影响:属于Domain Admins组的账户以服务身份运行时,默认生成过滤后的访问令牌,会移除Domain Admins组的SID。你手动交互式验证时使用的是提升后的完整令牌,因此可读取机密属性,但ADFS服务进程运行时的令牌被过滤,无法通过机密属性的权限校验。
- ADFS默认查询上下文偏差:ADFS内置的LDAP属性读取规则,默认优先使用ADFS服务器的计算机账户而非配置的服务账号执行AD查询,该计算机账户默认不属于Domain Admins组,无机密属性读取权限。
当你将SearchFlags重置为0、取消属性的机密标记后,普通标准用户/计算机账户即拥有该属性的默认读取权限,因此Claim可正常释放。
前置验证流程
调整配置前先定位实际触发原因:
- 打开ADFS服务器的服务管理器,定位
adfssrv服务,查看其配置的登录身份- 若登录身份为网络服务/本地系统:实际执行LDAP查询的是ADFS服务器的计算机账户(格式为
ADFS服务器主机名$) - 若登录身份为独立域账号:可在对应身份的进程下执行
whoami /groups,确认是否真的包含Domain Admins组的SID
- 若登录身份为网络服务/本地系统:实际执行LDAP查询的是ADFS服务器的计算机账户(格式为
- 用实际执行查询的身份,通过
ldp.exe工具连接AD,尝试读取测试用户的Employee-Number属性,确认是否复现读取失败的问题
推荐配置方案(不降低系统安全水位)
无需依赖Domain Admins组的继承权限,直接给执行LDAP查询的主体显式授予属性读取权限即可:
- 若ADFS使用计算机账户查询:打开ADSI Edit,定位到
Employee-Number属性的权限配置,在DACLs中添加该ADFS服务器的计算机账户,授予读取该属性的允许权限,确保无对应的拒绝权限项 - 若ADFS使用独立服务账号查询:直接给该服务账号本身授予
Employee-Number的读取权限,无需将其加入高权限组 - 若需要最小化权限范围:可在ADFS的Claim规则配置中,显式指定一个专门的低权限域账号作为LDAP绑定账号,仅给该账号授予
Employee-Number的读取权限
临时测试用备选方案
若需临时验证逻辑、不要求安全水位,可调整ADFS服务器的UAC配置,让服务进程获取未过滤的管理员令牌:
- 打开本地安全策略,定位到
本地策略 > 安全选项 - 修改
用户账户控制:管理员批准模式中管理员的提升权限提示的行为为不提示,直接提升 - 重启
adfssrv服务后再验证Claim释放效果
内容的提问来源于stack exchange,提问作者Systemspoet
相关产品推荐
相关产品推荐

