Problemen met de validatie van Azure Event Grid-abonnementen oplossen

Wanneer je een Event Grid-eventabonnement aanmaakt voor een webhook-endpoint, moet Event Grid bevestigen dat je eigenaar bent van het endpoint voordat het events levert. Als die validatiehanddruk niet wordt voltooid, mislukt het aanmaken van het abonnement. Dit artikel helpt je te achterhalen waarom de handdruk faalt en hoe je dit kunt oplossen.

Symptomen

Wanneer je een evenementenabonnement aanmaakt, zie je een foutmelding die lijkt op de volgende tekst:

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

De fout geeft aan dat Event Grid de validatiehandshake niet met je webhook-endpoint kon voltooien, dus maakt Event Grid het abonnement niet aan.

Cause

Event Grid vereist dat je eigendom van een webhook-endpoint bewijst voordat het begint met het leveren van events. Deze eis voorkomt dat een kwaadwillende gebruiker een eindpunt overspoelt met gebeurtenissen. De validatiefout verschijnt wanneer de handshake tussen Event Grid en je endpoint niet slaagt. Veelvoorkomende oorzaken zijn onder andere:

  • Je eindpunt stuurt de validatiecode voor de synchrone handshake niet terug, of retourneert 200 OK niet voor de asynchrone (handmatige) handshake.
  • Een firewall, Azure Application Gateway of webapplicatiefirewall (WAF) voor je endpoint blokkeert het validatieverzoek en keert terug 403 (Forbidden).
  • Je endpoint gebruikt het CloudEvents v1.0-schema, maar reageert niet op het HTTP OPTIONS-validatieverzoek.
  • Je endpoint gebruikt een zelfondertekend certificaat, dat Event Grid niet ondersteunt voor validatie.

Voor een volledige beschrijving van de validatiehandshake, zie Endpoint validatie met Event Grid event schema en Endpoint validatie met behulp van het CloudEvents-schema.

Oplossing 1: Test de validatiehanddruk voor een Event Grid-schema-abonnement

Stuur een voorbeeld van SubscriptionValidationEvent naar je webhook en bevestig het antwoord:

  1. Stuur een HTTP POST-verzoek naar je webhook-URL met een voorbeeld van een aanvraagbody SubscriptionValidationEvent met curl of een vergelijkbaar hulpprogramma.
  2. Als je webhook de synchrone handshake toepast, controleer dan of je webhook de validationCode in het antwoord teruggeeft. Je moet een HTTP 200 OK statuscode teruggeven. Event Grid herkent HTTP 202 Accepted geen geldig antwoord en het verzoek moet binnen 30 seconden worden afgerond.
  3. Als je webhook de asynchrone (handmatige) handdruk implementeert, controleer dan of je eindpunt 200 OK retourneert. Voltooi vervolgens de handdruk door binnen 10 minuten een GET-verzoek naar de validationUrl in the event-data te sturen. De validatie-URL gebruikt poort 553, dus werk je firewallregels bij als die poort geblokkeerd is.

Hier is een voorbeeld SubscriptionValidationEvent van een JSON-payload die je kunt versturen:

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

Hier is de verwachte succesvolle reactie:

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

Hier is het equivalente curl-commando voor het valideren van een webhook-abonnement dat het Event Grid-gebeurtenisschema gebruikt:

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}

Voor meer informatie, zie Endpoint validation with Event Grid event schema.

Oplossing 2: Verwijder firewall- of WAF-regels die het validatieverzoek blokkeren

Als je webhook 403 (Forbidden) retourneert, controleer dan of de webhook zich achter een Azure Application Gateway of een firewall voor webtoepassingen bevindt. Als dat zo is, schakel dan de volgende firewallregels uit en voer de HTTP POST opnieuw uit:

  • 920300 (Verzoek mist een Accept-header)
  • 942430 (Beperkte SQL-tekenafwijkingsdetectie (args): aantal speciale tekens overschreden (12))
  • 920230 (meerdere URL-codering gedetecteerd)
  • 942130 (SQL-injectieaanval: SQL-tautologie gedetecteerd)
  • 931130 (Mogelijke remote file inclusion-aanval (RFI): verwijzing of koppeling naar een extern domein)

Oplossing 3: Valideer een CloudEvents-schema-abonnement

Als je abonnement het CloudEvents v1.0-schema gebruikt, gebruikt Event Grid CloudEvents abuse-bescherming in plaats van het validatie-event voor het abonnement. Je endpoint moet reageren op de HTTP OPTIONS-methode en de WebHook-Allowed-Origin header teruggeven. Voor meer informatie, zie Endpoint validation met behulp van het CloudEvents-schema.

Als je meer hulp nodig hebt, stel je vraag op de Microsoft Q&A-pagina voor Event Grid of open een supportticket.