You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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())
    
  • 自定义扩展属性:
    1. 查询时需通过Select方法指定包含扩展属性:
      user, err := client.UsersById(userId).Select("id,displayName,dean.ext.test.1").Get(context.Background(), nil)
      
    2. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:47:41