多租户Microsoft Entra应用如何让所有租户用户获取自定义Claims
解决多租户Entra应用自定义Claims跨租户不生效的问题
要让所有租户(包括外部租户和个人Microsoft账户)的ID令牌都包含user.jobtitle和user.officelocation自定义Claims,需要调整权限配置和Claims映射方式,具体步骤如下:
1. 配置应用级读取权限
多租户应用读取外部租户用户属性必须具备应用权限,而非仅委托权限:
- 登录Microsoft Entra管理中心,找到你的应用,进入「API权限」页面。
- 添加权限 → 选择「Microsoft Graph」→ 「应用权限」→ 搜索并勾选
User.Read.All权限。 - 点击「授予管理员同意」(需本租户管理员操作),同时确保外部租户的管理员已为其租户用户授权该权限(或引导用户触发管理员同意流程)。
2. 使用Claims映射策略替代静态自定义Claims
Entra管理中心的静态自定义Claims仅对本租户用户生效,需通过Claims映射策略动态拉取用户属性:
- 打开PowerShell,连接Microsoft Graph:
Connect-MgGraph -Scopes "Policy.ReadWrite.ApplicationConfiguration" - 创建跨租户Claims映射策略:
$policyBody = @{ DisplayName = "CrossTenantCustomClaimsPolicy" ClaimsSchema = @( @{ Name = "jobtitle" Source = "user" SourceClaim = "jobTitle" JwtClaimType = "jobtitle" }, @{ Name = "officelocation" Source = "user" SourceClaim = "officeLocation" JwtClaimType = "officelocation" } ) } New-MgPolicyClaimMappingPolicy -BodyParameter $policyBody - 将策略分配给你的应用:
# 替换为你的应用ID $appServicePrincipalId = (Get-MgServicePrincipal -Filter "AppId eq '你的应用ID'").Id $policyId = (Get-MgPolicyClaimMappingPolicy -Filter "DisplayName eq 'CrossTenantCustomClaimsPolicy'").Id New-MgServicePrincipalClaimMappingPolicyByRef -ServicePrincipalId $appServicePrincipalId -RefId $policyId
3. 验证配置
- 用外部租户或个人Microsoft账户登录应用,解码ID令牌(可使用jwt.ms工具),检查是否包含
jobtitle和officelocation字段。 - 若个人Microsoft账户无对应属性,令牌中会缺失该字段,需在业务逻辑中处理空值场景。
注意事项
- 之前配置的自定义签名密钥无需调整,其仅负责令牌签名,不影响Claims生成逻辑。
- 外部租户需确保已同意应用的
User.Read.All权限,否则无法读取用户属性。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

