使用AD用户专属证书签名JWT实现ADFS用户认证可行性咨询
可行方案:ADFS基于AD用户证书的JWT签名验证(无需手动上传用户证书)
你的需求完全可以实现,核心是利用ADFS与Active Directory的原生集成,以及证书信任链机制,避免逐个上传用户证书。以下是具体实现思路和步骤:
核心原理
ADFS可以直接从Active Directory中读取用户绑定的公钥证书,无需手动导入到ADFS服务器。当用户用专属私钥签名JWT后,ADFS会根据JWT中的用户标识(如UPN、SID)查询AD获取对应公钥,完成签名验证和身份确认。
具体实现步骤
1. 将用户证书绑定到AD用户对象
- 单用户操作:打开「AD用户和计算机」→ 右键用户→ 属性→ 「属性编辑器」→ 找到
userCertificate→ 添加证书文件。 - 批量操作:使用PowerShell脚本批量导入,示例命令:
Set-ADUser -Identity <UserUPN> -Add @{userCertificate = (Get-Content <CertPath> -Encoding Byte)}
2. 配置ADFS启用用户证书身份验证
- 在ADFS管理控制台中,进入「身份验证方法」→ 选择「证书身份验证」(针对用户)→ 启用并配置:
- 勾选「允许用户使用证书登录」,设置证书验证方式为「Active Directory查询」。
- 确保ADFS服务账户拥有读取AD用户
userCertificate属性的权限(默认权限通常满足需求,若有问题可调整AD权限)。
3. 配置JWT令牌验证规则
- 在ADFS的目标应用程序组中,添加JWT验证规则:
- 创建自定义声明规则,从JWT中提取用户标识(如
upn或sub),查询AD获取该用户的userCertificate属性。 - 利用ADFS内置的「验证证书签名」规则,将提取的用户证书与JWT签名匹配验证。
- 创建自定义声明规则,从JWT中提取用户标识(如
更高效的替代方案(统一CA场景)
如果所有用户证书都由企业内部CA签发,无需绑定到AD用户属性:
- 将CA的根证书和中间证书导入ADFS的「受信任的根证书颁发机构」存储。
- 配置ADFS信任该CA签发的所有用户证书,ADFS会自动验证证书签名链,同时通过证书中的用户标识(如UPN字段)关联AD用户。
关于JWKS URL的说明
不建议为大量用户证书维护JWKS端点,原因:
- 用户证书会频繁过期、更换,JWKS端点维护成本极高。
- 利用AD或CA信任链的方式,ADFS会自动获取最新的用户证书或信任关系,无需手动更新JWKS。
参考方向
- 查阅ADFS官方文档中「用户证书身份验证」章节,了解AD与ADFS的证书集成细节。
- 参考ADFS自定义声明规则示例,学习如何通过用户标识关联AD证书并验证JWT签名。
内容的提问来源于stack exchange,提问作者Pea Kay See Es
相关产品推荐
相关产品推荐

