在Azure应用中将自定义安全属性配置为可选声明
问题解答
需求是否可实现?
可以实现,但不能直接通过你尝试的optionalClaims配置方式完成,因为自定义安全属性属于Azure AD的目录扩展属性,需要通过**Claims Mapping Policy(声明映射策略)**来将其注入到ID令牌中。
具体操作步骤
1. 确认自定义安全属性的权限配置
首先确保你的应用服务主体拥有读取该自定义安全属性的权限:
- 登录Azure门户,进入Azure Active Directory > 自定义安全属性。
- 找到包含
customerid的属性集,进入权限标签页。 - 添加你的应用服务主体,并授予读取权限。
2. 获取自定义安全属性的目录扩展名称
自定义安全属性在Azure AD中的实际存储名称格式为extension_<属性集ID>_<属性名>(使用下划线分隔,而非点)。比如你提到的b2c.customerid对应的目录扩展名称应为extension_b2c_customerid。
- 可通过Graph API查询确认:
GET https://graph.microsoft.com/v1.0/directory/extensionProperties
在返回结果中找到对应属性的name字段值。
3. 创建Claims Mapping Policy
使用PowerShell或Graph API创建策略,将自定义属性映射到ID令牌的customerid声明中:
PowerShell示例:
# 连接Azure AD Connect-AzureAD # 定义策略内容 $policyDefinition = @' { "ClaimsMappingPolicy": { "Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema": [ { "Source": "user", "ID": "extension_b2c_customerid", "JwtClaimType": "customerid" } ] } } '@ # 创建策略 $policy = New-AzureADPolicy -Definition $policyDefinition -DisplayName "CustomerID-IDToken-Policy" -Type "ClaimsMappingPolicy"
4. 将策略分配给应用服务主体
把创建好的策略绑定到你的应用服务主体上:
# 替换为你的应用服务主体ID Add-AzureADServicePrincipalPolicy -Id "<应用服务主体ID>" -RefObjectId $policy.Id
5. 更新应用清单(可选但推荐)
在应用清单中保留optionalClaims配置(移除错误的source字段):
"optionalClaims": { "idToken": [ { "name": "customerid", "essential": false } ] }
原配置失败原因
你之前的配置中使用source: "b2c.customerid"是错误的——Azure AD的optionalClaims的source字段仅支持默认的用户属性源(如user、extension等),无法直接引用自定义安全属性的名称格式,必须通过Claims Mapping Policy来完成映射。
内容的提问来源于stack exchange,提问作者Oskar Lundgren
相关产品推荐
相关产品推荐

