如何通过ADFS声明/转换规则修改SAML 2.0令牌的Audience属性?
没问题,完全可以通过ADFS 4.0的声明转换规则来修改SAML 2.0令牌里的<AudienceRestriction>中的<Audience>字段,不管是基于你已经发送的环境识别码动态切换,还是固定配置多受众都能实现。下面给你一步步说具体操作:
ADFS 4.0支持通过自定义声明规则语言(Claims Rule Language)直接控制Audience属性的生成,这完全覆盖你的需求——不管是替换原有Audience,还是根据环境识别码动态生成对应供应商环境的Audience都没问题。
1. 进入RP信任的声明规则界面
打开ADFS管理控制台,找到你配置的标识符为https://SP1/app的RP信任,右键选择属性,切换到声明规则标签页。
2. 处理默认Audience规则(可选但推荐)
默认情况下,ADFS会自动生成一条“颁发RP信任的标识符作为受众声明”的规则,这条规则会输出你当初配置的https://SP1/app作为Audience。如果要完全替换成供应商的环境地址,建议禁用或删除这条默认规则;如果要保留原有Audience同时添加供应商的地址,可以跳过这一步。
3. 添加自定义声明规则
点击添加规则,在弹出的向导中选择模板使用自定义规则发送声明,然后点击下一步:
- 给规则起个清晰的名字,比如“动态生成供应商Audience”
- 在“自定义规则”文本框中,根据你的需求选择对应的规则代码:
场景1:基于现有环境识别码动态切换Audience
假设你已经发送的环境识别码声明类型是http://schemas.yourcompany.com/claims/environment,值为prod(生产)或training(训练),规则代码如下:
// 匹配环境识别码声明 c:[Type == "http://schemas.yourcompany.com/claims/environment"] // 根据环境值动态生成对应供应商的Audience => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/audience", Value = c.Value == "prod" ? "https://vendor-prod.com/sp" : "https://vendor-training.com/sp");
注意:把代码里的声明类型、供应商地址替换成你实际使用的值。
场景2:固定添加多个Audience(同时支持原地址+供应商环境)
如果需要令牌里同时包含原Audience和两个供应商环境的地址,可以用多条issue语句:
// 保留原Audience => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/audience", Value = "https://SP1/app"); // 添加生产环境Audience => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/audience", Value = "https://vendor-prod.com/sp"); // 添加训练环境Audience => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/audience", Value = "https://vendor-training.com/sp");
4. 验证配置效果
配置完成后,你可以用以下方式验证:
- 使用ADFS自带的Claims X-Ray工具(在ADFS服务器上运行
Get-AdfsEndpoint找到对应的URL,访问后进行身份验证)查看生成的声明 - 用浏览器的SAML tracer插件捕获SAML响应,检查
<AudienceRestriction>节点下的<Audience>值是否符合预期
- 必须使用标准的Audience声明类型:
http://schemas.microsoft.com/ws/2008/06/identity/claims/audience,ADFS只会识别这个类型的声明来生成SAML令牌里的<Audience>元素 - 确保供应商的SP端已经将你设置的Audience地址添加到他们的信任配置中,否则令牌会因受众验证失败被拒绝
内容的提问来源于stack exchange,提问作者itismeap

