Azure Microsoft Graph API - 订阅 - 验证请求失败

问题描述 投票:2回答:2

我尝试为Azure用户数据(https://docs.microsoft.com/en-us/graph/webhooks)中的更改设置通知。

我从本地客户端向Azure Graph API发送请求,我在请求的有效负载中有一个公共服务器(带有SSL)作为通知URL。

Azure现在向我的服务器发送一个帖子请求(如文档中所示 - 确切的帖子请求见下文),我尝试发送我得到的令牌(如文档中所示)。但我总是收到以下错误消息“订阅验证请求失败。响应必须与validationToken查询参数完全匹配。”

来自Azure的发布请求:

Path: /?validationToken=Validation%3a+Testing+client+application+reachability+for+subscription+Request-Id%3a+3b3f9821-ce3f-23d9-879b-00a23f3 Body: is empty

我尝试了路径的每个部分和编码(就像请求ID或整个路径),但我总是得到错误消息。那么发回的权利是什么?

azure azure-active-directory microsoft-graph azure-ad-graph-api
2个回答
2
投票

首先,您收到的验证令牌应被视为不透明值并返回不变,错误Subscription validation request failed. Response must exactly match validationToken query parameter试图告诉您更改了某些内容。

由于验证令牌是作为URL查询参数提供给您的,因此请确保在返回之前在代码中使用正确解码的值。

以下是Microsoft Docs:Notification endpoint validation的相关文档

POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}

enter image description here

其他要求(来自同一参考文献):

  • 10秒内回复
  • 200(OK)状态代码。
  • 内容类型必须是text / plain。
  • 正文必须包含验证令牌。

代码示例

ASP.NET MVC Sample - 具体看一下NotificationController.cs文件

    [HttpPost]
    public async Task<ActionResult> Listen()
    {

        // Validate the new subscription by sending the token back to Microsoft Graph.
        // This response is required for each subscription.
        if (Request.QueryString["validationToken"] != null)
        {
            var token = Request.QueryString["validationToken"];
            return Content(token, "plain/text");
        }

Node.js code sample - 具体看看listen.js

/* Default listen route */
listenRouter.post('/', (req, res, next) => {
  let status;
  let clientStatesValid;

  // If there's a validationToken parameter in the query string,
  // then this is the request that Office 365 sends to check
  // that this is a valid endpoint.
  // Just send the validationToken back.
  if (req.query && req.query.validationToken) {
    res.send(req.query.validationToken);
    // Send a status of 'Ok'
    status = 200;
  }

0
投票

您应该使用validationToken响应代码从查询字符串返回HTTP 200。您还必须在几秒钟内完成此操作,否则图表将无法通过请求,您创建订阅的调用将失败。

以下是ASP.NET Web API 2中验证端点的示例:

public ActionResult<string> Post([FromQuery]string validationToken = null)
{
    if(!string.IsNullOrEmpty(validationToken))
    {
        Console.WriteLine($"Token: '{validationToken}'");
        return Ok(validationToken);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.