You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:53:14