使用msgraph-sdk-go创建用户Schema Extension遇上限问题及咨询
问题解答
1. 为什么会报错“每个应用最多支持2个扩展值”?
先搞清楚Schema Extension和Open Extension的本质区别:
- Schema Extension是全局通用的扩展架构,需要先通过
POST /schemaExtensions创建这个架构,它属于你的应用注册,所有用户都能基于这个架构存储数据。微软默认给每个应用注册的自定义Schema Extension配额是2个(可申请提升配额)。 - Open Extension是单个用户专属的临时扩展,无需提前定义架构,每个用户最多可添加100个,不占用Schema Extension的配额。
你代码里存在误区:直接向/users/{id}/extensions提交SchemaExtension模型,这并不是创建Schema Extension的正确方式,但错误提示指向Schema Extension的应用配额,说明你之前已经用当前应用注册创建过2个Schema Extension架构(无论是否给用户实例化),因此再尝试创建新的就触发了配额限制。
另外要注意:Schema Extension的配额是按应用注册统计的,而非按用户——因为它是全局架构,属于你的应用,而非单个用户。你之前创建的2个Open Extension和这个配额无关。
2. 如何查看/删除用户的扩展?
Azure门户没有直接查看单个用户扩展的入口,需用Graph Explorer或代码操作:
查看扩展
- 查询指定用户的所有扩展(包含Open Extension和Schema Extension实例):
GET https://graph.microsoft.com/v1.0/users/{userId}/extensions - 查询当前应用注册下的所有Schema Extension全局架构:
GET https://graph.microsoft.com/v1.0/schemaExtensions?$filter=owner eq '你的应用clientId'
删除扩展
- 删除指定用户的某个扩展实例:
DELETE https://graph.microsoft.com/v1.0/users/{userId}/extensions/{extensionId} - 删除全局Schema Extension架构(注意:删除后所有用户的该扩展数据会丢失):
DELETE https://graph.microsoft.com/v1.0/schemaExtensions/{schemaExtensionId}
用msgraph-sdk-go删除的示例代码:
// 删除指定用户的某个扩展 err := client.UsersById(userId).ExtensionsById(extensionId).Delete(context.Background(), nil) // 删除全局Schema Extension架构 err := client.SchemaExtensionsById(schemaExtensionId).Delete(context.Background(), nil)
3. 门户中“适用于所有用户的用户属性”与扩展的关系?如何用msgraph-sdk-go访问?
门户中的该属性分两类:
- 内置属性:如用户名、邮箱等,是Azure AD用户对象自带的字段,和扩展无关。
- 自定义属性:在门户“用户属性”中添加的自定义字段,本质是基于Schema Extension实现的全局架构,所有用户均可使用。
用msgraph-sdk-go访问的方法:
- 内置属性:直接从User模型的字段获取:
user, err := client.UsersById(userId).Get(context.Background(), nil) if err != nil { // 处理错误 } fmt.Println("用户邮箱:", *user.GetMail()) - 自定义扩展属性:
- 查询时需通过
Select方法指定包含扩展属性:user, err := client.UsersById(userId).Select("id,displayName,dean.ext.test.1").Get(context.Background(), nil) - 通过
AdditionalData获取扩展值:extensionData := user.GetAdditionalData() theme := extensionData["dean.ext.test.1_theme"].(string) color := extensionData["dean.ext.test.1_color"].(string)
extension_{应用clientId}_属性名,例如extension_12345678-1234-1234-1234-1234567890ab_favoriteColor。 - 查询时需通过
内容的提问来源于stack exchange,提问作者Dean Schulze
相关产品推荐
相关产品推荐

