Webhook订阅验证消息中没有ClientState

时间:2018-05-29 09:39:40

标签: c# microsoft-graph

我目前正在订阅日历活动:

var request = graphClient.Subscriptions.Request();

var result = await request.AddAsync(
    new Subscription {
        ChangeType = "created,updated,deleted",
            NotificationUrl = notificationUrl,
            Resource = "/users/" + userId + "/" + resource,
            ExpirationDateTime = DateTimeOffset.UtcNow.AddMinutes(4230),
            ClientState = "my-subscription-identifier"
    }
);

可以声明ClientState,因此当收到通知时,我可以通过将ClientState与创建订阅请求中发送的状态进行比较来处理它吗?

发送订阅请求后,服务器会向我发送验证消息。 我缺少的是Microsoft Graph验证请求中的ClientState

change notifications下的文档中,请求描述如下:

POST https://{notificationUrl}?validationToken={TokenDefinedByMicrosoftGraph}
ClientState: {Data sent in ClientState value in subscription request (if any)}

不幸的是,我无法在验证请求(或任何其他部分)的正文中找到客户端状态。

  • 客户端状态声明是否正确?

  • 如果是,为什么ClientState不在验证请求中 在文档中描述(因为它似乎对安全性很重要 原因)?

修改

我使用ngrok测试我的webhooks。我收到的验证令牌发布消息的原始数据如下所示:

POST /?validationToken=NmMwNjE5YjAtNzc3Zi00NmMwLWI1ZmYtYjJiNWI5NzU0MGY5 
HTTP/1.1
Host: localhost:12345
User-Agent: Go-http-client/1.1
Content-Length: 0
Content-Type: text/plain; charset=utf-8
X-Forwarded-For: 
X-Forwarded-Proto: https
X-Original-Host: 5a665085.eu.ngrok.io

如果我收到更新通知,例如请求正文如下所示:

{
"value": [
    {
        "subscriptionId": "de6c71b...",
        "subscriptionExpirationDateTime": "2018-06-02T05:11:28.6421943+00:00",
        "changeType": "updated",
        "resource": "Users/9c4661.../Events/AQMkAGY4Y2E0YjZiLTA4ZDctNGJ...",
        "resourceData": {
            "@odata.type": "#Microsoft.Graph.Event",
            "@odata.id": "Users/9c4661.../Events/AQMkAGY4Y2E0YjZiLTA4ZDctNGJ...",
            "@odata.etag": "W/\"DwAAABYAAABzyrM9Qi...\"",
            "id": "AQMkAGY4Y2E0YjZiLTA4ZDctNGJ..."
        },
        "clientState": "my-subscription-identifier"
    }
]
}

1 个答案:

答案 0 :(得分:2)

初始验证的目标是让Microsoft验证客户端的通知URL:它已启动且响应迅速,并且可以接受通知。

验证意味着无副作用且不披露任何信息。

到目前为止,我们还没有遇到过包含clientState有用的场景,这就是为什么我们不将它包含在验证请求中。

如果您有一个案例,其中包含此请求中的更多信息会有用(例如,作为更大的场景/工作流程的一部分),您可以简要描述一下吗?

注意:我们很快会更新文档以与API行为保持一致。