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

时间:2019-03-14 10:39:07

标签: azure azure-active-directory microsoft-graph azure-ad-graph-api

我尝试为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或整个路径一样),但是我总是收到错误消息。那么发回什么是正确的事情?

2 个答案:

答案 0 :(得分:2)

首先,应将收到的验证令牌视为不透明值并返回不变,并且错误INSERT INTO sandwich_parts (part) values (':value') INSERT INTO sandwich_parts (part) values ('jam') INSERT INTO sandwich_parts (part) values (':value') INSERT INTO sandwich_parts (part) values ('bread') INSERT INTO sandwich_parts (part) values (':value') INSERT INTO sandwich_parts (part) values ('peanut butter') 试图告诉您某些更改。

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

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

Subscription validation request failed. Response must exactly match validationToken query parameter

enter image description here

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

  • 在10秒内回复
  • 200(确定)状态码。
  • 内容类型必须为文本/纯文本。
  • 主体必须包含验证令牌。

代码示例

ASP.NET MVC Sample-专门查看NotificationController.cs文件

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

Node.js code sample-专门研究listen.js

    [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");
        }

答案 1 :(得分: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);
    }
}