如何为MS Graph API的AAD /users集合创建指定字段变更订阅?
解决MS Graph API订阅用户指定字段变更通知的问题
问题核心
你尝试通过/users?$select=GivenName,Surname,MobilePhone,BusinessPhones创建订阅,但仅收到前两个字段的变更通知,且无法实现“仅指定字段变更时触发通知”的需求——这是因为你误解了$select参数的作用:它仅控制通知payload中返回的字段,而非筛选触发通知的变更字段。
正确实现方案
要仅在指定字段(GivenName、Surname、MobilePhone、BusinessPhones)变更时接收通知,需使用Delta查询订阅,而非直接订阅/users集合。Delta查询专门用于跟踪资源的增量变更,只有当你指定的字段发生变化时,才会生成变更条目并触发通知。
代码示例(Microsoft.Graph v5.9.0)
var subscription = new Subscription { ChangeType = "updated", NotificationUrl = "https://your-webhook-endpoint.com", Resource = "/users/delta?$select=GivenName,Surname,MobilePhone,BusinessPhones", ExpirationDateTimeOffset = DateTimeOffset.UtcNow.AddDays(3), // 订阅最长有效期3天 ClientState = "your-unique-client-state", // 用于验证通知合法性 LatestSupportedTlsVersion = "v1_2" }; // 创建订阅 var createdSubscription = await graphClient.Subscriptions.PostAsync(subscription);
关键说明
- 使用
/users/delta资源:Delta查询会持续跟踪指定字段的变更,只有当这些字段的值发生变化时,才会触发订阅通知,从根源减少无用通知。 - 权限要求:确保你的应用已获得
User.Read.All(或更高)的应用权限,并完成管理员同意。 - 集合字段支持:
BusinessPhones作为集合类型字段,Delta查询会正常跟踪其添加、删除、修改的变更。 - 订阅有效期:MS Graph订阅最长有效期为3天,需在过期前重新创建订阅以持续接收通知。
内容的提问来源于stack exchange,提问作者Petr Sedláček
相关产品推荐
相关产品推荐

