在Access Token中使用ExtensionAttributes配置可选声明的问题
解决Azure AD OIDC Access Token中添加extensionAttribute15的问题
以下是几个关键排查和解决方向:
确认应用权限配置
Access Token中要读取用户的extensionAttribute15,你的应用必须拥有Directory.Read.All或User.Read.All的应用权限(注意是应用权限,不是委派权限),并且已经完成管理员同意。如果缺少这个权限,Azure AD不会在Access Token中返回用户属性。检查optionalClaims的正确格式
你的配置框架没问题,但需要注意几个细节:- 属性名要准确:使用
extensionAttribute15(首字母大写的Attribute),避免小写拼写错误 - 确保应用注册类型是Web应用/API:SPA或原生应用的Access Token默认不会包含自定义用户属性,只有Web应用/API的Access Token才会返回这类声明
- 标准配置示例:
"optionalClaims": { "accessToken": [ { "name": "extensionAttribute15", "source": "user", "essential": false, "additionalProperties": [] } ], "idToken": [], "saml2Token": [] }
- 属性名要准确:使用
使用Claims Mapping Policy替代optionalClaims
如果optionalClaims配置始终不生效,Claims Mapping Policy是更可靠的方案,步骤如下:- 连接Azure AD PowerShell:
Connect-AzureAD - 创建Claims Mapping Policy:
New-AzureADPolicy -Definition @('{ "ClaimsMappingPolicy": { "Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema": [ { "Source": "user", "ID": "extensionAttribute15", "JwtClaimType": "extensionAttribute15" } ] } }') -DisplayName "ExtensionAttribute15ToAccessToken" -Type "ClaimsMappingPolicy" - 将策略分配给目标应用:
$policy = Get-AzureADPolicy -Filter "DisplayName eq 'ExtensionAttribute15ToAccessToken'" $app = Get-AzureADServicePrincipal -Filter "AppId eq '你的应用Client ID'" Add-AzureADServicePrincipalPolicy -Id $app.ObjectId -RefObjectId $policy.ObjectId
- 连接Azure AD PowerShell:
验证Token内容
使用https://jwt.ms解码Access Token,确认两点:- Token的
aud字段是你的应用Client ID(而非Microsoft Graph的ID) - 用户的
extensionAttribute15字段确实有值(空值不会被包含在Token中)
- Token的
内容的提问来源于stack exchange,提问作者user2046611
相关产品推荐
相关产品推荐

