Azure AD B2C自定义策略添加自定义属性时出现信息校验失败报错
报错核心定位
日志抛出的错误为:
400/Request_BadRequest: The following extension properties are not available: extension_f41be....._tipoUsuario
这个错误直接指向策略配置未正确关联b2c-extensions-app的扩展属性实体,并非自定义属性本身未创建,所有问题都出在TrustFrameworkExtensions.xml的配置逻辑上。
具体配置错误及修正方法
AAD-Common技术配置文件的Metadata键值对完全错位
当前配置将应用ID、对象ID的取值当成了Metadata的Key名,没有使用规定的固定配置键,导致整个通用配置完全失效。正确的AAD-Common配置结构为:<TechnicalProfile Id="AAD-Common"> <Metadata> <!-- 固定Key为ApplicationId,值填b2c-extensions-app的应用ID --> <Item Key="ApplicationId">你的b2c-extensions-app应用ID(如5bfd8xxx-xxxx)</Item> <!-- 固定Key为ObjectId,值填b2c-extensions-app的服务主体对象ID --> <Item Key="ObjectId">你的b2c-extensions-app对象ID(如18bd6xxx-xxxx)</Item> </Metadata> </TechnicalProfile>注意:Metadata的Key是Azure AD B2C约定的固定配置名,值才是从门户获取的对应ID,不能将ID值作为Key写入。
所有AAD读写类技术配置文件未关联AAD-Common通用配置
目前配置的AAD-UserWriteUsingLogonEmail、AAD-UserWriteProfileUsingObjectId、AAD-UserReadUsingEmailAddress、AAD-UserReadUsingObjectId四个技术配置文件,都没有通过IncludeTechnicalProfile节点引入AAD-Common的通用配置,即便AAD-Common的键值对修正完成,对应的配置也不会在读写流程中生效。每个AAD类技术配置文件都需要补充引入节点,示例:<TechnicalProfile Id="AAD-UserWriteUsingLogonEmail"> <Metadata> <Item Key="client_id">你的b2c-extensions-app应用ID(去除横杠,即报错中f41be开头的那段值)</Item> </Metadata> <!-- 必须补充这行引入AAD-Common的通用配置 --> <IncludeTechnicalProfile ReferenceId="AAD-Common" /> <PersistedClaims> <!-- 自定义属性引用必须使用完整全名字段 --> <PersistedClaim ClaimTypeReferenceId="extension_f41bexxxx_tipoUsuario" /> </PersistedClaims> </TechnicalProfile>自定义属性的ClaimType引用名不匹配
当前在PersistedClaims、OutputClaims节点中使用的extension_tipoUsuario是短名,但Azure AD B2C为目录扩展属性生成的正式命名规则为extension_{b2c-extensions-app应用ID去横杠}_属性名,即报错日志中提示的extension_f41be....._tipoUsuario。需要先在策略文件的ClaimsSchema段定义和这个全名完全一致的ClaimType,再在所有读写节点中引用该全名字段,不能使用短名替代。
修正后校验流程
- 确认b2c-extensions-app上的
tipoUsuario自定义属性已经完成创建,存在对应的目录实体,而非仅在策略文件中定义ClaimType - 按照B2C策略的上传顺序依次更新策略文件:先上传基础依赖策略,再上传扩展策略,最后上传依赖方策略,避免旧配置缓存导致校验失败
- 注意区分两个不同的ID:b2c-extensions-app的应用ID(用于生成扩展属性命名前缀、作为client_id调用Graph接口)、应用对象ID(服务主体的ObjectId,用于权限校验),两个ID值不能混用
内容的提问来源于stack exchange,提问作者Victor Moreira

