疑難排解 Azure 事件方格 訂閱驗證失敗

當你為 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 並確認回應:

  1. 使用 curl 或類似工具,向你的 webhook URL 發送 HTTP POST 請求,並附上範例 SubscriptionValidationEvent 請求主體。
  2. 如果你的 webhook 實作了同步交握,請確認 webhook 會在回應中回傳 validationCode。 您必須回傳狀態 HTTP 200 OK 碼。 Event Grid 無法辨識 HTTP 202 Accepted 為有效回應,請求必須在 30 秒內完成。
  3. 如果您的 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 的事件方格頁面 提出問題,或開啟 支援工單。