Azure AD中自定义Security Attribute无法加入JWT访问令牌的问题求助
在Azure AD中将用户自定义安全属性作为JWT访问令牌声明的实现方法
要将自定义安全属性entitlements添加到Azure AD生成的JWT访问令牌中,你之前的操作遗漏了关键的声明映射配置步骤,以下是可落地的实现方案:
关键前提确认
- 确保你的自定义安全属性是用户范围的,且已成功为目标用户分配对应权限值(user/reports/admin等)
- 确认属性的完整扩展名称格式:
extension_<租户ID>_<属性集名称>_entitlements,可通过Azure AD门户的自定义安全属性详情页或Graph API获取
方法一:使用Claims Mapping Policy(推荐,支持多值属性)
这是最可靠的配置方式,适合自定义安全属性的声明映射:
- 连接到Microsoft Graph PowerShell:
Connect-MgGraph -Scopes "Policy.ReadWrite.ApplicationConfiguration" - 创建声明映射策略:
$tenantId = "你的Azure AD租户ID" $attributeSetName = "你的属性集名称" # 你创建entitlements属性时指定的属性集 $policy = @{ DisplayName = "EntitlementsClaimPolicy" Description = "将用户自定义安全属性entitlements加入访问令牌" ClaimsMappingPolicy = @" { "ClaimsMappingPolicy": { "Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema": [ { "Source": "user", "ID": "extension_$tenantId`_$attributeSetName`_entitlements", "JwtClaimType": "entitlements" } ] } } "@ } $createdPolicy = New-MgPolicyClaimMappingPolicy -BodyParameter $policy - 将策略分配给目标应用注册:
$appClientId = "你的应用注册Client ID" $servicePrincipal = Get-MgServicePrincipal -Filter "appId eq '$appClientId'" New-MgServicePrincipalClaimMappingPolicyByRef -ServicePrincipalId $servicePrincipal.Id -RefId $createdPolicy.Id
方法二:通过应用注册Manifest配置可选声明
如果你倾向于用门户配置,需确保可选声明使用正确的扩展属性名称:
在应用注册的Manifest中,修改optionalClaims部分如下:
"optionalClaims": { "accessToken": [ { "name": "extension_<租户ID>_<属性集名称>_entitlements", "source": "user", "essential": false, "additionalProperties": [] } ], "idToken": [], "saml2Token": [] }, "accessTokenAcceptedVersion": 2
验证步骤
- 注销并重新登录你的应用,确保获取新的访问令牌(避免缓存)
- 使用jwt.ms解析令牌,检查是否存在
entitlements声明,多值属性会以数组形式返回
你之前操作的问题点
- 企业应用SSO配置中手动输入
entitlements无效,因为自定义安全属性不属于默认的user.*系列属性,必须使用完整的扩展名称 - 可选声明配置时未使用正确的扩展属性ID,导致Azure AD无法识别并注入声明
内容的提问来源于stack exchange,提问作者user8862290
相关产品推荐
相关产品推荐

