Azure AD向JWT令牌添加samAccountName自定义声明配置问题咨询
问题根因说明
你不需要在「Optional claims」列表中找到samAccountName:Azure Portal的可选声明预置列表只会展示微软官方内置的可选声明项,不会同步你通过PowerShell自定义的Claims Mapping Policy规则,页面上的警告标识是正常提示,仅代表当前应用绑定了自定义声明映射策略,不属于配置错误。
你当前配置存在明确错误,同时遗漏了几项必要校验步骤,具体如下:
现有配置错误
- ClaimsMappingPolicy JSON语法非法
你提供的策略定义中,ClaimsSchema数组内的声明对象末尾多了一个冗余逗号,Azure AD对策略定义的JSON语法校验非常严格,这类语法问题会导致策略虽然创建成功,但运行时被静默忽略,完全不生效。
错误片段示例:
"JwtClaimType": "samAccountName" }, // 此处冗余逗号属于语法错误 ]
遗漏的必要校验与配置
- 策略绑定对象校验
ClaimsMappingPolicy必须绑定到资源服务主体(即你请求Token所要访问的目标应用/API对应的服务主体),如果误将策略绑定到客户端应用的服务主体,映射规则完全不会生效。
你可以通过以下命令校验当前策略绑定的对象是否正确:
# 将<policy-id>替换为你创建的ClaimsMappingPolicy的Object ID Get-AzureADPolicyAppliedObject -Id <policy-id>
应用域所有权校验
如果你的应用配置了自定义应用ID URI(格式通常为api://your-domain.com/app-id),必须确保URI中使用的域已经在Azure AD租户中完成了所有权验证,未验证域下的应用会被Azure AD直接忽略自定义声明映射规则,即使acceptMappedClaims设为true也无效。源属性存在性校验
onpremisessamaccountname属性只会从本地Active Directory同步到Azure AD,纯云创建的用户、未开启AAD Connect目录同步的租户中,该属性值为空,即使策略配置完全正确,空值属性也不会被注入到Token中。你可以先查询对应用户的属性,确认值存在再做后续验证。Token请求端点校验
自定义声明映射规则仅对你自己配置的自定义API/应用生效,如果你请求的是微软官方服务(比如Microsoft Graph、Azure Resource Manager)的Token,映射规则不会执行。
修复与验证步骤
- 删除原有错误策略,重新创建语法正确的ClaimsMappingPolicy,参考命令如下:
New-AzureADPolicy -Definition @('{ "ClaimsMappingPolicy": { "Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema": [ { "Source": "user", "ID": "onpremisessamaccountname", "SamlClaimType": "samaccountname", "JwtClaimType": "samAccountName" } ] } }') -DisplayName "att_ext_samaccountname_even2_prod" -Type "ClaimsMappingPolicy"
- 将新创建的策略正确绑定到目标资源的服务主体,移除之前错误的绑定关系。
- 再次确认应用清单中
acceptMappedClaims属性值为true,保存后未被系统自动回退。 - 按照你的业务场景正常发起Token请求,拿到Token后解码查看声明内容,只要配置正确,
samAccountName会自动出现在Token中,不需要在Portal可选声明页面手动添加。
内容的提问来源于stack exchange,提问作者Marie Gutierrez
相关产品推荐
相关产品推荐

