Rozwiązywanie problemów z błędami weryfikacji subskrypcji usługi Azure Event Grid

Gdy tworzysz subskrypcję zdarzeń Event Grid dla punktu końcowego webhook, Event Grid musi potwierdzić, że jesteś właścicielem tego punktu, zanim dostarczy zdarzenia. Jeśli to uzgadnianie walidacji nie zakończy się, utworzenie subskrypcji zakończy się niepowodzeniem. Ten artykuł pomoże Ci zidentyfikować, dlaczego uścisk ręki nie działa i jak to naprawić.

Symptoms

Gdy tworzysz subskrypcję zdarzenia, pojawia się komunikat o błędzie podobny do następującego tekstu:

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

Błąd oznacza, że Event Grid nie mógł ukończyć walidacyjnego handshake'u z Twoim endpointem webhook, więc Event Grid nie tworzy subskrypcji.

Cause

Usługa Event Grid wymaga potwierdzenia własności punktu końcowego webhooka, zanim zacznie dostarczać zdarzenia. Ten wymóg zapobiega zalewaniu punktu końcowego zdarzeniami przez złośliwego użytkownika. Błąd walidacji pojawia się, gdy handshake między Event Grid a Twoim punktem końcowym nie zadziała. Typowe przyczyny:

  • Twój punkt końcowy nie odsyła kodu walidacyjnego podczas synchronicznego uzgadniania ani nie zwraca 200 OK dla asynchronicznego (ręcznego) uzgadniania.
  • Zapora sieciowa, Azure Application Gateway lub firewall aplikacji webowych (WAF) przed Twoim punktem końcowym blokuje żądanie walidacji i zwraca 403 (Forbidden).
  • Twój punkt końcowy używa schematu CloudEvents v1.0, ale nie odpowiada na zapytanie o weryfikację HTTP OPTIONS .
  • Twój endpoint używa certyfikatu podpisanego samodzielnie, którego Event Grid nie obsługuje do weryfikacji.

Pełny opis walidacyjnego handshake'u można znaleźć w artykule Walidacja punktów końcowych ze schematem zdarzeń Event Grid oraz walidacja punktów końcowych przy użyciu schematu CloudEvents.

Rozwiązanie 1: Przetestuj walidacyjny handshake dla subskrypcji schematu Event Grid

Wyślij przykładowe zdarzenie SubscriptionValidationEvent do swojego webhooka i potwierdź odpowiedź:

  1. Wyślij żądanie HTTP POST na adres URL webhooka wraz z przykładowym SubscriptionValidationEvent ciałem żądania, używając narzędzia curl lub podobnego.
  2. Jeśli Twój webhook obsługuje synchroniczny handshake, sprawdź, czy zwraca element validationCode w odpowiedzi. Musisz zwrócić HTTP 200 OK kod statusu. Event Grid nie rozpoznaje HTTP 202 Accepted odpowiedzi jako poprawnej i żądanie musi zostać zakończone w ciągu 30 sekund.
  3. Jeśli Twój webhook implementuje asynchroniczny (ręczny) handshake, sprawdź, czy punkt końcowy zwraca .200 OK Następnie zakończ handshake, wysyłając żądanie GET do validationUrl danych zdarzenia w ciągu 10 minut. URL walidacyjny używa portu 553, więc zaktualizuj reguły zapory, jeśli ten port jest zablokowany.

Oto przykładowy SubscriptionValidationEvent ładunek JSON, który możesz wysłać:

[
  {
    "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"
  }
]

Oto spodziewana udana reakcja:

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

Oto odpowiednik polecenia curl do weryfikacji subskrypcji webhook korzystającej ze schematu zdarzeń Event Grid:

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}

Aby dowiedzieć się więcej, zobacz walidację punktów końcowych za pomocą schematu zdarzeń Event Grid.

Rozwiązanie 2: Usuń reguły zapory lub WAF, które blokują żądanie walidacji

Jeśli webhook zwraca 403 (Forbidden), sprawdź, czy znajduje się za usługą Azure Application Gateway lub zaporą aplikacji internetowych. Jeśli tak, wyłącz następujące reguły zapory i ponownie wykonaj HTTP POST:

  • 920300 (Żądanie bez nagłówka Accept)
  • 942430 (Ograniczone wykrywanie anomalii znaków SQL (args): liczba znaków specjalnych przekroczona (12))
  • 920230 (Wykryto kodowanie wielu adresów URL)
  • 942130 (Atak wtryskowy SQL: wykryto tautologię SQL)
  • 931130 (Możliwy atak polegający na zdalnym dołączaniu plików (RFI): odwołanie lub łącze spoza domeny)

Rozwiązanie 3: Zweryfikować subskrypcję schematu CloudEvents

Jeśli Twoja subskrypcja korzysta ze schematu CloudEvents v1.0, Event Grid stosuje ochronę przed nadużyciami CloudEvents zamiast zdarzenia walidacyjnego subskrypcji. Twój punkt końcowy musi obsługiwać metodę HTTP OPTIONS i zwracać nagłówek WebHook-Allowed-Origin. Aby dowiedzieć się więcej, zobacz walidację punktów końcowych za pomocą schematu CloudEvents.

Jeśli potrzebujesz dodatkowej pomocy, zadaj pytanie na stronie Microsoft Q&A dotyczącej usługi Event Grid lub otwórz zgłoszenie pomocy technicznej.