如何基于现有ADFS 3.0服务器场生成含用户AD组的JWT令牌?
在ADFS 3.0(Windows Server 2012 R2)中生成包含用户所有AD组的JWT令牌步骤
我刚好有过在ADFS 3.0环境下配置这类需求的实战经验,下面是一步步的操作指南,适配你的Windows Server 2012 R2环境:
1. 确认ADFS服务器场的基础状态
- 先确保你的ADFS 3.0服务器场运行正常,既然已经启用了第三方应用认证,说明AD与ADFS的连接、证书等基础依赖都是没问题的。
- 可以先检查ADFS是否能正常读取用户AD组:打开
ADFS Management,导航到Trust Relationships->Claims Provider Trusts,找到Active Directory信任,右键选择Edit Claim Rules,确认默认规则能读取用户属性和组信息。
2. 创建自定义声明规则(核心步骤:让ADFS把所有AD组放进令牌)
默认ADFS不会自动将用户所有AD组注入JWT,需要手动添加声明规则:
- 打开
ADFS Management,找到Relying Party Trusts:如果你的内部自定义应用还没创建,先右键Add Relying Party Trust完成基础配置;如果已有,直接选中目标应用。 - 右键应用选择
Edit Claim Rules,切换到Issuance Transform Rules标签页,点击Add Rule。 - 选择
Send LDAP Attributes as Claims模板,点击Next。 - 给规则命名(比如
Send All AD Groups to JWT),在Attribute store下拉选择Active Directory。 - 在
LDAP Attribute列选择Token-Groups - Unqualified Names(返回用户所属所有AD组的名称),然后在Outgoing Claim Type列输入Group(或者用标准的http://schemas.xmlsoap.org/claims/Group)。小贴士:如果需要组的SID而非名称,可选择
Token-Groups - Qualified Names,对应调整输出声明类型即可。 - 点击
Finish保存规则。 - 处理大令牌限制:如果用户所属AD组较多,JWT可能超出默认大小限制,打开PowerShell执行以下命令调整:
这里设置为10MB,可根据实际组数量调整。Set-ADFSProperties -MaximumReceivedMessageSize 10485760 Set-ADFSProperties -MaximumIssuedTokenSize 10485760
3. 基于OAuth/SAML协议配置应用
选项A:使用OAuth 2.0(适合REST类自定义应用)
- 右键目标应用选择
Properties,切换到Advanced标签页,确保Secure hash algorithm选择SHA-256(ADFS 3.0支持,安全性更高)。 - 切换到
Endpoints标签页,点击Add,选择Type为OAuth,Binding为POST,Trusted URL填写应用的回调地址(比如https://your-internal-app.com/oauth/callback),点击OK。 - 打开PowerShell配置OAuth客户端信息:
替换占位符为你的应用实际信息。Add-ADFSClient -ClientId "your-app-unique-client-id" -Name "Your Internal Custom App" -RedirectUri "https://your-internal-app.com/oauth/callback" Set-ADFSRelyingPartyTrust -TargetName "Your Internal Custom App" -IssueOAuthRefreshTokensTo AllDevices
选项B:使用SAML 2.0(适合传统Web应用)
- 右键目标应用选择
Properties,切换到Identifiers标签页,添加应用的实体ID(比如https://your-internal-app.com/saml/metadata)。 - 切换到
Endpoints标签页,添加SAML Assertion Consumer Endpoint,绑定选POST,URL填写应用的SAML回调地址。 - 确认之前创建的组声明规则已生效:ADFS会把组信息放进SAML断言,若应用需要JWT,可通过应用侧的SAML-to-JWT转换工具实现,或者优先选择OAuth方案更直接。
4. 测试验证JWT内容
- 使用测试用户登录自定义应用,获取JWT令牌。
- 用本地JWT解析工具(避免敏感数据外传)解析令牌,查看
payload部分是否包含所有AD组信息,对应声明键为你之前设置的Group或自定义名称。 - 若组信息未出现,排查方向:
- 检查声明规则是否选择了正确的LDAP属性,是否启用。
- 确认测试用户确实属于目标AD组,可重启ADFS服务同步信息:
Restart-Service ADFS。 - 检查依赖方信任的规则配置是否正确。
内容的提问来源于stack exchange,提问作者user25010




