Microsoft graph api 从Microsoft Graph Webhook收到的通知中缺少ValidationToken

Microsoft graph api 从Microsoft Graph Webhook收到的通知中缺少ValidationToken,microsoft-graph-api,microsoft-teams,microsoft-graph-teams,Microsoft Graph Api,Microsoft Teams,Microsoft Graph Teams,我们正在使用Microsoft Graph(beta版)Webhooks获得有关Microsoft团队状态变化的通知,目前我们的客户存在一个问题。 当我们从Graph API收到状态更改通知时,它不包含validationTokens属性,因此验证和后续处理失败。 我们的代码与Microsoft提供的类似 在客户处收到的请求的(简化/缩短)内容如下所示: { “价值”:[ { “订阅ID”:“…”, “客户状态”:“…”, “变更类型”:“已更新”, “资源”:“通信/存在?$filter=id

我们正在使用Microsoft Graph(beta版)Webhooks获得有关Microsoft团队状态变化的通知,目前我们的客户存在一个问题。 当我们从Graph API收到状态更改通知时,它不包含
validationTokens
属性,因此验证和后续处理失败。 我们的代码与Microsoft提供的类似

在客户处收到的请求的(简化/缩短)内容如下所示:

{
“价值”:[
{
“订阅ID”:“…”,
“客户状态”:“…”,
“变更类型”:“已更新”,
“资源”:“通信/存在?$filter=id+in+(…)”,
“subscriptionExpirationDateTime”:“2021-04-22T02:06:56.2872368-07:00”,
“资源数据”:{
“@odata.id”:“通信/存在?$filter=id+in+(…)”,
“@odata.type”:“#Microsoft.Graph.presence”,
“id”:“…”
},
“租户”:“…”,
“加密内容”:{
“数据”:“…”,
“数据签名”:“…”,
“数据密钥”:“…”,
“encryptionCertificateId”:“3”,
“encryptionCertificateThumbprint”:“…”
}
}
]
}
与我们的实验室相比,请求主体缺少
validationTokens
属性:

{
“价值”:[
{
“订阅ID”:“…”,
“客户状态”:“…”,
“变更类型”:“已更新”,
“资源”:“通信/存在?$filter=id+in+(…)”,
“subscriptionExpirationDateTime”:“2021-04-26T00:07:08.9251516-07:00”,
“资源数据”:{
“@odata.id”:“通信/存在?$filter=id+in+(…)”,
“@odata.type”:“#Microsoft.Graph.presence”,
“id”:“…”
},
“租户”:“…”,
“加密内容”:{
“数据”:“…”,
“数据签名”:“…”,
“数据密钥”:“…”,
“encryptionCertificateId”:“3”,
“encryptionCertificateThumbprint”:“…”
}
}
],
“validationTokens”:[
"..."
]
}
根据,
validationTokens
仅为带有资源数据的更改通知提供-这里就是这种情况,因此我们猜测应该存在
validationTokens

欢迎任何提示

编辑 下面是一段截短的代码,用于反序列化请求正文/处理通知请求:


公共异步函数侦听(connectorId作为Guid,apiLinkId作为Guid,可选validationToken作为String=Nothing)作为任务(IActionResult的)
如果不是String.IsNullOrEmpty(validationToken),则
'通过将令牌发送回Microsoft Graph来验证新订阅。
'每个订阅都需要此响应。
返回内容(WebUtility.HtmlEncode(validationToken))
如果结束
尝试
'解析收到的通知。
使用{.PropertyNameCaseSensitive=True}将选项作为新的JsonSerializerOptions进行Dim
options.Converters.Add(新的JSONStringUnumConverter(JsonNamingPolicy.CamelCase))
将通知作为新字典(字符串的,更改通知)()
Dim notificationCollection=Await JsonSerializer.DeserializeAsync(属于ChangeNotificationCollection)(Request.Body,options)
notificationCollection.Value_
.其中(函数(x)x.EncryptedContent为Nothing)_
.ForEach(分包)(通知)
Dim subscription=Stores.TeamsPresenceSubscriptionStore.Instance.GetValueOrDefault(notification.SubscriptionId.Value)
'验证当前客户端状态与发送的客户端状态匹配。
如果订阅为notification.ClientState subscription.SecretClientState或LSE notification.ClientState,则
Log.msg(Category.TEAMS,“错误:无法验证通知”)
返回
如果结束
'只需保留每个资源的最新通知。多次提取数据没有意义。
普通通知(notification.Resource)=通知
末端接头)
如果.Count>0,则
'查询已更改的邮件
GetChangedMessages(plainNotifications.Values)
如果结束
如果notificationCollection.ValidationTokens不是Nothing,也不是notificationCollection.ValidationTokens.Any(),则
'->notificationCollection.ValidationTokens未在客户上设置
如果结束
特例
'仍然返回202,因此服务不会重新发送通知。
结束尝试
返回已接受()
端函数
创建订阅的代码是

Subscription=graphApi.Client.Subscriptions.Request().AddAsync(带有
{
.Resource=$“/communications/presences?$filter=id in({String.Join(“,”,userIds.Select(函数(id)$”{id}'))})”中的id,
.ChangeType=“已更新”,
.NotificationUrl=$“{publicNotificationEndpoint}/Notification/{connectorid}/{Me.GraphApi.Link.Id}”,
.LifecycleNotificationUrl=$“{publicNotificationEndpoint}/LifecycleNotification/{connectorid}/{Me.GraphApi.Link.Id}”,
.ClientState=SecretClientState,
.ExpirationDateTime=DateTime.UtcNow.Add(最大订阅寿命),
.EncryptionCertificate=Convert.ToBase64String(EncryptionCertificate.Export(X509ContentType.Cert)),
.EncryptionCertificateId=encryptionCertificate.Version.ToString(),
.IncludeResourceData=True