Delen via


Gebeurtenisverzending voor de webhook

Webhooks zijn een van de vele manieren om gebeurtenissen te ontvangen van Azure Event Grid. Wanneer een nieuwe gebeurtenis gereed is, poseert de Event Grid-service een HTTP-aanvraag naar het geconfigureerde eindpunt met de gebeurtenisgegevens in de aanvraagbody.

Net als veel andere services die webhooks ondersteunen, moet u in Event Grid het eigendom van uw Webhook-eindpunt bewijzen voordat het begint met het leveren van gebeurtenissen aan dat eindpunt. Deze vereiste voorkomt dat een kwaadwillende gebruiker uw eindpunt overspoelt met gebeurtenissen.

Eindpuntvalidatie met Event Grid-gebeurtenissen

Wanneer u een van de volgende drie Azure-services gebruikt, verwerkt de Azure-infrastructuur deze validatie automatisch:

Als u een ander type eindpunt gebruikt, zoals een Op HTTP-trigger gebaseerde Azure-functie, moet uw eindpuntcode deelnemen aan een validatiehanddruk met Event Grid. Event Grid ondersteunt twee manieren om het abonnement te valideren.

  • Synchrone handshake: Op het moment dat een gebeurtenisabonnement is gemaakt, verzendt Event Grid een abonnementsvalidatiegebeurtenis naar uw eindpunt. Het schema van deze gebeurtenis is vergelijkbaar met andere Event Grid-gebeurtenissen. Het gegevensgedeelte van deze gebeurtenis bevat een validationCode eigenschap. Uw toepassing controleert of de validatieaanvraag voor een verwacht gebeurtenisabonnement is en retourneert de validatiecode synchroon in het antwoord. Dit handshake-mechanisme wordt ondersteund in alle Event Grid-versies.

  • Asynchrone handshake: In bepaalde gevallen kunt u het validationCode antwoord niet synchroon retourneren. Als u bijvoorbeeld een service van derden (zoals Zapier of IFTTT) gebruikt, kunt u niet programmatisch reageren met de validatiecode.

    Event Grid ondersteunt een handmatige validatiehanddruk. Als u een gebeurtenisabonnement maakt met een SDK of hulpprogramma dat gebruikmaakt van API-versie 2018-05-01-preview of hoger, verzendt Event Grid een validationUrl eigenschap in het gegevensgedeelte van de abonnementsvalidatiegebeurtenis. Als u de handshake wilt voltooien, zoekt u die URL in de gebeurtenisgegevens en voert u een GET-aanvraag uit. U kunt een REST-client of uw webbrowser gebruiken.

    De opgegeven URL is 10 minuten geldig. Gedurende die tijd is AwaitingManualActionde inrichtingsstatus van het gebeurtenisabonnement. Als u de handmatige validatie niet binnen 10 minuten voltooit, wordt de inrichtingsstatus ingesteld op Failed. U moet het gebeurtenisabonnement opnieuw maken voordat u de handmatige validatie start.

    Dit verificatiemechanisme vereist ook dat het webhook-eindpunt een HTTP-statuscode van 200 retourneert, zodat deze weet dat de POST voor de validatiegebeurtenis is geaccepteerd voordat deze in de handmatige validatiemodus kan worden geplaatst. Met andere woorden, als het eindpunt 200 retourneert maar niet synchroon een validatieantwoord retourneert, wordt de modus overgezet naar de handmatige validatiemodus. Als er binnen tien minuten een GET op de validatie-URL is, wordt de validatiehanddruk beschouwd als geslaagd.

Notitie

Het gebruik van zelfondertekende certificaten voor validatie wordt niet ondersteund. Gebruik in plaats daarvan een ondertekend certificaat van een commerciële certificeringsinstantie (CA).

Validatiedetails

  • Op het moment van het maken/bijwerken van een gebeurtenisabonnement plaatst Event Grid een gebeurtenis voor abonnementsvalidatie op het doeleindpunt.
  • De gebeurtenis bevat een headerwaarde aeg-event-type: SubscriptionValidation.
  • De hoofdtekst van de gebeurtenis heeft hetzelfde schema als andere Event Grid-gebeurtenissen.
  • De eventType eigenschap van de gebeurtenis is Microsoft.EventGrid.SubscriptionValidationEvent.
  • De data eigenschap van de gebeurtenis bevat een validationCode eigenschap met een willekeurig gegenereerde tekenreeks. Bijvoorbeeld: validationCode: acb13….
  • De gebeurtenisgegevens bevatten ook een validationUrl eigenschap met een URL voor het handmatig valideren van het abonnement.
  • De matrix bevat alleen de validatie-gebeurtenis. Andere gebeurtenissen worden verzonden in een afzonderlijke aanvraag nadat u de validatiecode hebt teruggezet.
  • De EventGrid-gegevensvlak-SDK's hebben klassen die overeenkomen met de gebeurtenisgegevens van de abonnementsvalidatie en het antwoord op de abonnementsvalidatie.

Een voorbeeld van SubscriptionValidationEvent wordt weergegeven in het volgende voorbeeld:

[
  {
    "id": "2d1781af-3a4c-4d7c-bd0c-e34b19da4e66",
    "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "subject": "",
    "data": {
      "validationCode": "512d38b6-c7b8-40c8-89fe-f46f9e9622b6",
      "validationUrl": "https://rp-eastus2.eventgrid.azure.net:553/eventsubscriptions/myeventsub/validate?id=0000000000-0000-0000-0000-00000000000000&t=2022-10-28T04:23:35.1981776Z&apiVersion=2018-05-01-preview&token=1A1A1A1A"
    },
    "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime": "2022-10-28T04:23:35.1981776Z",
    "metadataVersion": "1",
    "dataVersion": "1"
  }
]

Als u het eigendom van het eindpunt wilt bewijzen, herhaalt u de validatiecode in de validationResponse eigenschap, zoals wordt weergegeven in het volgende voorbeeld:

{
  "validationResponse": "512d38b6-c7b8-40c8-89fe-f46f9e9622b6"
}

Voer een van de volgende stappen uit:

  • U moet een HTTP 200 OK-antwoordstatuscode retourneren. HTTP 202 Geaccepteerd wordt niet herkend als een geldig validatieantwoord voor een Event Grid-abonnement. De HTTP-aanvraag moet binnen 30 seconden worden voltooid. Als de bewerking niet binnen 30 seconden is voltooid, wordt de bewerking geannuleerd en kan deze na 5 seconden opnieuw worden uitgevoerd. Als alle pogingen mislukken, wordt deze behandeld als validatiehanddrukfout.

    Het feit dat uw toepassing is voorbereid om de validatiecode te verwerken en te retourneren, geeft aan dat u het gebeurtenisabonnement hebt gemaakt en verwacht dat u de gebeurtenis ontvangt. Stel dat er geen handshakevalidatie wordt ondersteund en dat een hacker uw toepassings-URL weet. De hacker kan een onderwerp en een gebeurtenisabonnement maken met de URL van uw toepassing en beginnen met het uitvoeren van een DoS-aanval naar uw toepassing door veel gebeurtenissen te verzenden. De handshakevalidatie voorkomt dat dit gebeurt.

    Stel dat u de validatie al in uw app hebt geïmplementeerd omdat u uw eigen gebeurtenisabonnementen hebt gemaakt. Zelfs als een hacker een gebeurtenisabonnement met uw app-URL maakt, controleert uw juiste implementatie van de validatieaanvraaggebeurtenis de aeg-subscription-name header in de aanvraag om na te gaan of het een gebeurtenisabonnement is dat u herkent.

    Zelfs na die juiste handshake-implementatie kan een hacker uw app overspoelen (het heeft het gebeurtenisabonnement al gevalideerd) door een aanvraag te repliceren die afkomstig lijkt te zijn van Event Grid. Om dat te voorkomen, moet u uw webhook beveiligen met Microsoft Entra-verificatie. Zie Gebeurtenissen leveren aan met Microsoft Entra beveiligde eindpunten voor meer informatie.

  • U kunt het abonnement ook handmatig valideren door een GET-aanvraag naar de validatie-URL te verzenden. Het gebeurtenisabonnement blijft in behandeling totdat het is gevalideerd. De validatie-URL maakt gebruik van poort 553. Als uw firewallregels poort 553 blokkeren, moet u regels bijwerken voor een geslaagde handmatige handshake.

    Als u in uw validatie van de abonnementsvalidatie-gebeurtenis vaststelt dat het geen gebeurtenisabonnement is waarvoor u gebeurtenissen verwacht, retourneert u helemaal geen 200-respons of helemaal geen antwoord. Daarom mislukt de validatie.

Zie een C#-voorbeeld voor een voorbeeld van het verwerken van de handshake van de abonnementsvalidatie.

Eindpuntvalidatie met CloudEvents v1.0

CloudEvents v1.0 implementeert zijn eigen semantiek voor misbruikbeveiliging met behulp van de METHODE HTTP OPTIONS . Hier vindt u meer informatie. Wanneer u het CloudEvents-schema voor uitvoer gebruikt, maakt Event Grid gebruik van cloudevents v1.0 misbruikbeveiliging in plaats van het Event Grid-validatiemechanisme.

Compatibiliteit van gebeurtenisschema's

Wanneer een onderwerp wordt gemaakt, wordt een binnenkomende gebeurtenisschema gedefinieerd. En wanneer een abonnement wordt gemaakt, wordt er een uitgaand gebeurtenisschema gedefinieerd. In de volgende tabel ziet u de compatibiliteit die is toegestaan bij het maken van een abonnement.

Schema voor binnenkomende gebeurtenissen Schema voor uitgaande gebeurtenissen Ondersteund
Event Grid-schema Event Grid-schema Ja
Cloud events v1.0 schema Ja
Aangepast invoerschema Nee
Cloud events v1.0 schema Event Grid-schema Nee
Cloud events v1.0 schema Ja
Aangepast invoerschema Nee
Aangepast invoerschema Event Grid-schema Ja
Cloud events v1.0 schema Ja
Aangepast invoerschema Ja

Volgende stappen

Zie het volgende artikel voor meer informatie over het oplossen van problemen met validaties van gebeurtenisabonnementen: Problemen met validaties van gebeurtenisabonnementen oplossen.