如何在Azure AD应用注册的access_token而非id_token中添加onPremisesSamAccountName声明?
解决方案:将onPremisesSamAccountName加入access_token且仅在access_token中显示
1. 修正ClaimsMappingPolicy配置
确保策略明确指定声明仅写入access_token,而非id_token。使用PowerShell创建或更新策略:
# 创建新的Claims Mapping Policy New-AzureADPolicy -Definition @('{ "ClaimsMappingPolicy": { "Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema": [ { "Source": "user", "ID": "onPremisesSamAccountName", "JwtClaimType": "sam_account_name", # 可按需自定义声明名称 "Destination": "access_token" # 关键:指定仅写入access_token } ] } }') -DisplayName "SamAccountToAccessToken" -Type "ClaimsMappingPolicy"
2. 绑定策略到对应服务主体
将上述策略关联到你的应用注册对应的服务主体:
# 获取目标策略对象 $policy = Get-AzureADPolicy -Filter "DisplayName eq 'SamAccountToAccessToken'" # 获取应用的服务主体(替换为你的应用客户端ID) $sp = Get-AzureADServicePrincipal -Filter "AppId eq '你的应用客户端ID'" # 完成策略绑定 Add-AzureADServicePrincipalPolicy -Id $sp.Id -RefObjectId $policy.Id
3. 调整OAuth请求范围(核心修正)
你之前使用openid范围会触发OpenID Connect流程,此时返回的access_token受众为Azure AD自身,而非你的应用,导致ClaimsMappingPolicy不生效。需改为请求你的应用自定义范围:
- 在Azure应用注册的「API权限」→「添加权限」→「我的API」中,为你的应用创建自定义范围(例如
access_as_user) - 在Google OAuth Playground的「Select & authorize APIs」中,输入该范围(格式:
api://{你的应用客户端ID}/access_as_user),而非openid
4. 验证结果
获取access_token后,使用JWT解码工具查看,确认sam_account_name(或你定义的声明名称)已包含在access_token的payload中,且id_token中不会出现该声明。
内容的提问来源于stack exchange,提问作者jjcastil
相关产品推荐
相关产品推荐

