排查 Azure 事件网格订阅验证失败

当你为Webhook端点创建事件网格事件订阅时,事件网格必须确认你拥有该端点,才能发送事件。 如果验证握手未完成,订阅创建失败。 本文帮助你找出握手失败的原因以及如何解决。

症状

创建活动订阅时,你会看到类似以下文字的错误信息:

The attempt to validate the provided endpoint https://your-endpoint-here failed. For more details, visit https://aka.ms/esvalidation

错误表明事件网格无法完成与你的webhook端点的验证握手,因此事件网格不会创建订阅。

原因

Event Grid要求你在开始传递事件前证明拥有Webhook端点的所有权。 这一要求防止恶意用户用事件淹没终端。 当事件网格与你的端点握手未成功时,就会出现验证错误。 常见原因包括:

  • 你的端点不会回响同步握手的验证代码,也不会返回 200 OK 异步(手动)握手代码。
  • 在你端点前方的防火墙、Azure 应用程序网关或Web应用防火墙(WAF)会阻止验证请求并返回403 (Forbidden)
  • 你的端点使用了CloudEvents v1.0的模式,但不会响应 HTTP OPTIONS 验证请求。
  • 你的端点使用自签名证书,而事件网格不支持自签名验证。

关于验证握手的完整描述,请参见 “使用事件网格事件模式的端点验证 ”和 “使用CloudEvents模式实现端点验证”。

解决方案1:测试事件网格模式订阅的验证握手

向你的webhook发送一个 SubscriptionValidationEvent 的示例并确认回复:

  1. 使用 curl 或类似工具,向你的 webhook URL 发送 HTTP POST 请求,并在请求中附上示例 SubscriptionValidationEvent 请求正文。
  2. 如果你的 Webhook 实现了同步握手,请确认你的 Webhook 在响应中返回 validationCode。 您必须返回 HTTP 200 OK 状态码。 事件网格不识别 HTTP 202 Accepted 为有效响应,请求必须在30秒内完成。
  3. 如果你的 Webhook 采用了异步(手动)握手机制,请确认你的端点会返回 200 OK。 然后在10分钟内向事件数据发送GET请求 validationUrl ,完成握手。 验证URL使用553端口,如果该端口被封锁,请更新防火墙规则。

这里有一个 SubscriptionValidationEvent 示例JSON载荷,你可以发送:

[
  {
    "id": "aaaa0000-bb11-2222-33cc-444444dddddd",
    "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "subject": "",
    "data": {
      "validationCode": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
    },
    "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime": "2018-01-25T22:12:19.4556811Z",
    "metadataVersion": "1",
    "dataVersion": "1"
  }
]

以下是预期的成功回应:

{
  "validationResponse": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
}

以下是用于验证使用事件网格事件模式的webhook订阅的等效curl命令:

curl -X POST -d '[{"id": "aaaa0000-bb11-2222-33cc-444444dddddd","topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","subject": "","data": {"validationCode": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"},"eventType": "Microsoft.EventGrid.SubscriptionValidationEvent","eventTime": "2018-01-25T22:12:19.4556811Z", "metadataVersion": "1","dataVersion": "1"}]' -H 'Content-Type: application/json' https://{your-webhook-url.com}

欲了解更多信息,请参阅 使用事件网格事件模式的端点验证

解决方案2:移除阻挡验证请求的防火墙或WAF规则

如果你的 webhook 返回 403 (Forbidden),请检查它是否位于 Azure 应用程序网关 或 Web 应用程序防火墙后面。 如果是,请禁用以下防火墙规则,并重新执行HTTP POST:

  • 920300(请求缺少 Accept 标头)
  • 942430(受限SQL字符异常检测(args):特殊字符数超过(12))
  • 920230(检测到多个 URL 编码)
  • 942130(SQL 注入攻击:检测到 SQL 同义反复式)
  • 931130(可能的远程文件包含攻击(RFI):域外引用或链接)

解决方案 3:验证 CloudEvents 架构订阅

如果你的订阅使用 CloudEvents v1.0 架构,Event Grid 使用 CloudEvents 滥用保护,而不是订阅验证事件。 你的端点必须响应 HTTP OPTIONS 方法并返回头部 WebHook-Allowed-Origin 。 欲了解更多信息,请参阅 使用 CloudEvents 模式进行端点验证

如果你需要更多帮助,请在适用于 Event Grid 的 Microsoft 问答页面上提出你的问题,或创建支持请求