AzureAD自定义声明策略无法将MailNickName转大写写入JWT
故障根因
你的自定义策略不生效是3个配置错误共同导致的:
- 字段类型不匹配:
IncludeBasicClaimSet字段在policy1中传的是JSON布尔值true,但Azure AD声明映射策略要求该字段必须为字符串类型的"true"/"false",类型不符会直接导致整个策略被引擎跳过、完全不加载。你可正常运行的policy2中该字段就是正确的字符串格式。 - 转换输入参数名错误:
ChangeCase转换方法要求输入声明的TransformationClaimType固定值为inputClaim,你配置的是inputClaim1(多了数字后缀1),转换逻辑无法匹配到输入值,直接执行失败。参考你正常运行的Join转换配置,其TransformationClaimType值string1完全匹配Join方法的官方参数定义,ChangeCase方法的输入参数没有数字后缀。 - 同名声明冲突:你将转换后声明的
JwtClaimType设为mailnickname,和作为输入源的原生用户属性ID重名,如果原生属性被标记为输出项,会触发同名冲突,转换后的声明会被引擎直接丢弃。
修正后的可用配置
将原policy1替换为以下内容即可,修正了上述所有问题:
$policy1 = @('{ "ClaimsMappingPolicy":{ "Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema":[ { "Source": "user", "ID": "mailnickname" }, { "Source":"transformation", "ID":"testmailnickname", "TransformationId":"ChangeToUpper", "JwtClaimType":"mailnickname" } ], "ClaimsTransformations":[{ "ID":"ChangeToUpper", "TransformationMethod":"ChangeCase", "InputClaims":[{ "ClaimTypeReferenceId":"mailnickname", "TransformationClaimType":"inputClaim" }], "InputParameters":[{ "ID":"toCase", "DataType":"string", "Value":"UPPER" }], "OutputClaims":[{ "ClaimTypeReferenceId":"testmailnickname", "TransformationClaimType":"outputClaim" }] }] } }')
部署注意事项
- 先执行
Remove-AzureADServicePrincipalPolicy删除之前绑定到服务主体的旧错误策略,避免多策略叠加冲突 - 用新配置创建策略并重新绑定到服务主体
- 请求新令牌前务必清空客户端的令牌缓存,避免拿到缓存的旧令牌
- 解码新颁发的JWT即可看到值为全大写格式的
mailnickname声明
内容的提问来源于stack exchange,提问作者EvenThis
相关产品推荐
相关产品推荐

