当你为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 的示例并确认回复:
- 使用 curl 或类似工具,向你的 webhook URL 发送 HTTP POST 请求,并在请求中附上示例
SubscriptionValidationEvent请求正文。 - 如果你的 Webhook 实现了同步握手,请确认你的 Webhook 在响应中返回
validationCode。 您必须返回HTTP 200 OK状态码。 事件网格不识别HTTP 202 Accepted为有效响应,请求必须在30秒内完成。 - 如果你的 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 问答页面上提出你的问题,或创建支持请求。