當你為 webhook 端點建立事件網格事件訂閱時,Event Grid 必須確認你擁有該端點,才能提供事件。 如果驗證握手沒完成,訂閱創建就會失敗。 本文將協助你找出握手失敗的原因以及如何修復。
Symptoms
當你建立活動訂閱時,會看到類似以下文字的錯誤訊息:
The attempt to validate the provided endpoint https://your-endpoint-here failed. For more details, visit https://aka.ms/esvalidation
錯誤表示 Event Grid 無法完成與你的 webhook 端點的驗證握手,因此 Event Grid 不會建立訂閱。
Cause
Event Grid 要求你在開始傳送事件前,先證明擁有 webhook 端點的所有權。 這項要求可防止惡意使用者以大量事件灌爆端點。 當 Event Grid 與你的端點握手失敗時,就會出現驗證錯誤。 常見的原因包括:
- 你的端點不會回傳同步握手的驗證碼,或是非同步(手動)握手時不會回傳
200 OK。 - 防火牆、Azure 應用程式閘道 或網頁應用程式防火牆(WAF)會阻擋驗證請求並回傳
403 (Forbidden)。 - 你的端點使用 CloudEvents v1.0 架構,但不會回應 HTTP OPTIONS 驗證請求。
- 你的端點使用自簽憑證,而 Event Grid 不支援這種驗證。
關於驗證握手的完整說明,請參見 「使用事件網格事件結構的端點驗證 」及 「使用 CloudEvents 架構進行端點驗證」。
解決方案 1:測試事件方格結構描述訂閱的驗證交握
請將範例 SubscriptionValidationEvent 傳送到你的 webhook 並確認回應:
- 使用 curl 或類似工具,向你的 webhook URL 發送 HTTP POST 請求,並附上範例
SubscriptionValidationEvent請求主體。 - 如果你的 webhook 實作了同步交握,請確認 webhook 會在回應中回傳
validationCode。 您必須回傳狀態HTTP 200 OK碼。 Event Grid 無法辨識HTTP 202 Accepted為有效回應,請求必須在 30 秒內完成。 - 如果您的 Webhook 實作非同步 (手動) 交握,請確認您的端點是否傳回
200 OK。 接著,在 10 分鐘內向事件資料中的validationUrl傳送 GET 請求,以完成握手。 驗證網址使用 port 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"
}
以下是驗證使用 Event Grid 事件結構的 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}
欲了解更多,請參閱 「端點驗證與事件網格事件結構」。
解決方案二:移除阻擋驗證請求的防火牆或 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 架構進行端點驗證。
相關內容
如果您需要更多協助,請在 Microsoft Q&A 的事件方格頁面 提出問題,或開啟 支援工單。