如何通过Graph API或SDK为Azure AD B2C实例创建全局用户自定义属性
需求可行性判定
该需求完全可以通过Microsoft Graph API/SDK实现,最终生成的全局自定义属性和Azure门户手动创建的属性无任何差异:Azure门户创建B2C用户全局自定义属性的操作,底层本身就是调用同一套Graph接口完成的,不存在功能差异。
核心逻辑澄清:门户中展示的“B2C全局用户属性”,本质是注册在B2C租户默认内置的b2c-extensions-app应用上的目录扩展属性,绑定到User实体全局生效,并非单用户级别的字段。
前置要求
- 调用Graph接口的身份需要具备全局管理员、身份策略管理员或云应用管理员权限,和门户操作的权限要求完全一致
- 调用所需的应用授权需要包含
Directory.ReadWrite.All应用权限,覆盖目录扩展属性的创建能力
具体操作步骤
1. 定位内置的b2c扩展应用
每个Azure AD B2C租户默认存在一个不可删除的内置应用b2c-extensions-app,专门用于存储所有全局自定义用户属性,不需要手动创建。
通过Graph接口查询获取该应用的唯一ID:
GET https://graph.microsoft.com/v1.0/applications?$filter=displayName eq 'b2c-extensions-app. Do not modify. Used by AADB2C for storing user data.'
从返回结果中提取该应用的id字段值,后续创建属性需要用到。
2. 基于REST API创建全局自定义用户属性
在上述内置应用下创建扩展属性,即可等价完成门户中“添加用户属性”的操作,接口调用规则如下:
- 接口地址:
POST https://graph.microsoft.com/v1.0/applications/{上一步获取的应用ID}/extensionProperties - 请求参数完全对齐门户的能力边界:
name:自定义属性的短名称,比如示例中的ShoeSize,Graph会自动按照门户统一的命名规则为属性添加全局唯一前缀,最终生成的完整属性ID和门户创建的格式完全一致dataType:仅支持三种和门户匹配的类型:string、boolean、integer,对应门户提供的String、Boolean、Int选项,传入其他类型会超出B2C的能力范围,无法被用户流识别description:对应门户中可选填写的属性备注描述targetObjects:固定填入["User"],代表该属性全局绑定到用户实体,所有用户实例都可使用
示例请求体(以创建整数类型的ShoeSize属性为例):
{ "name": "ShoeSize", "dataType": "integer", "description": "用户鞋码信息", "targetObjects": ["User"] }
3. 基于Graph SDK创建全局自定义用户属性
所有主流语言的Graph SDK都原生支持上述接口操作,不需要手动拼接请求:
- 调用SDK内置的应用查询方法,通过显示名称过滤获取b2c-extensions-app的应用ID
- 初始化
extensionProperty对象,按照上述参数要求填充属性名称、数据类型、绑定目标、描述信息 - 调用SDK内置的扩展属性创建方法提交请求,即可完成全局属性创建,和REST API的效果完全一致
操作效果对齐说明
通过上述接口或SDK创建的属性,会自动同步到Azure门户的用户属性列表中,后续在配置用户流、自定义策略时,选择自定义属性的流程和门户手动创建的属性完全一致,不存在任何使用差异。
避坑提示
- 不要直接在单个用户对象上写入自定义字段充当全局属性,这类字段不会被B2C的身份流程识别,不属于全局可用的自定义属性范畴
- 属性创建完成后不需要额外执行同步操作,全局即时生效,租户内所有用户实体自动具备该属性的存储能力
内容的提问来源于stack exchange,提问作者freak_geek
相关产品推荐
相关产品推荐

