Dela via


Leverans av webhook-händelser

Webhooks är ett av många sätt att ta emot händelser från Azure Event Grid. När en ny händelse är klar skickar Event Grid-tjänsten en HTTP-begäran till den konfigurerade slutpunkten med händelseinformationen i begärandetexten.

Precis som många andra tjänster som stöder webhooks kräver Event Grid att du bevisar ägarskap för din Webhook-slutpunkt innan den börjar leverera händelser till slutpunkten. Det här kravet förhindrar att en obehörig användare översvämmar slutpunkten med händelser.

Slutpunktsverifiering med Event Grid-händelser

När du använder någon av följande tre Azure-tjänster hanterar Azure-infrastrukturen automatiskt den här verifieringen:

Om du använder någon annan typ av slutpunkt, till exempel en HTTP-utlösarbaserad Azure-funktion, måste slutpunktskoden delta i ett valideringshandskakning med Event Grid. Event Grid stöder två sätt att verifiera prenumerationen.

  • Synkron handskakning: När händelseprenumerationen skapas skickar Event Grid en prenumerationsverifieringshändelse till slutpunkten. Schemat för den här händelsen liknar alla andra Event Grid-händelser. Datadelen av den här händelsen innehåller en validationCode egenskap. Ditt program verifierar att valideringsbegäran är för en förväntad händelseprenumeration och returnerar valideringskoden i svaret synkront. Den här handskakningsmekanismen stöds i alla Event Grid-versioner.

  • Asynkron handskakning: I vissa fall kan du inte returnera validationCode svaret synkront. Om du till exempel använder en tjänst från tredje part (t.ex Zapier . eller IFTTT) kan du inte svara programmatiskt med valideringskoden.

    Event Grid har stöd för en manuell valideringshandskakning. Om du skapar en händelseprenumeration med ett SDK eller verktyg som använder API version 2018-05-01-preview eller senare, skickar Event Grid en validationUrl egenskap i datadelen av prenumerationsverifieringshändelsen. För att slutföra handskakningen letar du reda på webbadressen i händelsedata och gör en GET-begäran till den. Du kan använda antingen en REST-klient eller webbläsaren.

    Den angivna URL:en är giltig i 10 minuter. Under den tiden är AwaitingManualActionetableringstillståndet för händelseprenumerationen . Om du inte slutför den manuella valideringen inom 10 minuter är etableringstillståndet inställt på Failed. Du måste skapa händelseprenumerationen igen innan du startar den manuella valideringen.

    Den här autentiseringsmekanismen kräver också att webhook-slutpunkten returnerar en HTTP-statuskod på 200 så att den vet att POST för verifieringshändelsen accepterades innan den kan placeras i manuellt valideringsläge. Med andra ord, om slutpunkten returnerar 200 men inte returnerar ett valideringssvar synkront, övergår läget till det manuella valideringsläget. Om det finns en GET på validerings-URL:en inom 10 minuter anses valideringshandskakningen vara lyckad.

Kommentar

Det går inte att använda självsignerade certifikat för validering. Använd ett signerat certifikat från en certifikatutfärdare (CA) i stället.

Verifieringsinformation

  • När händelseprenumerationen skapas/uppdateras publicerar Event Grid en prenumerationsverifieringshändelse till målslutpunkten.
  • Händelsen innehåller ett rubrikvärde aeg-event-type: SubscriptionValidation.
  • Händelsetexten har samma schema som andra Event Grid-händelser.
  • Egenskapen eventType för händelsen är Microsoft.EventGrid.SubscriptionValidationEvent.
  • Egenskapen data för händelsen innehåller en validationCode egenskap med en slumpmässigt genererad sträng. Exempel: validationCode: acb13…
  • Händelsedata innehåller även en validationUrl egenskap med en URL för manuellt validering av prenumerationen.
  • Matrisen innehåller endast verifieringshändelsen. Andra händelser skickas i en separat begäran när du har upprepat verifieringskoden.
  • EventGrid-dataplanets SDK:er har klasser som motsvarar prenumerationsverifieringshändelsedata och svar på prenumerationsverifiering.

Ett exempel på SubscriptionValidationEvent visas i följande exempel:

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

Bekräfta slutpunktsägarskapet genom att upprepa verifieringskoden i validationResponse egenskapen, som du ser i följande exempel:

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

Och följ något av följande steg:

  • Du måste returnera en HTTP 200 OK-svarsstatuskod . HTTP 202 Accepted känns inte igen som ett giltigt valideringssvar för Event Grid-prenumerationen. HTTP-begäran måste slutföras inom 30 sekunder. Om åtgärden inte slutförs inom 30 sekunder avbryts åtgärden och den kan försöka igen efter 5 sekunder. Om alla försök misslyckas behandlas det som ett handskakningsfel för validering.

    Det faktum att ditt program är förberett för att hantera och returnera valideringskoden anger att du skapade händelseprenumerationen och förväntades ta emot händelsen. Tänk dig att det inte finns någon verifiering av handskakning som stöds och en hackare lär känna din program-URL. Hackaren kan skapa ett ämne och en händelseprenumeration med programmets URL och börja utföra en DoS-attack till ditt program genom att skicka många händelser. Handskakningsverifieringen förhindrar att detta sker.

    Anta att valideringen redan har implementerats i din app eftersom du har skapat dina egna händelseprenumerationer. Även om en hackare skapar en händelseprenumeration med din app-URL söker din korrekta implementering av händelsen för verifieringsbegäran efter huvudet i begäran för aeg-subscription-name att kontrollera att det är en händelseprenumeration som du känner igen.

    Även efter den korrekta handskakningsimplementeringen kan en hackare översvämma din app (den har redan verifierat händelseprenumerationen) genom att replikera en begäran som verkar komma från Event Grid. För att förhindra detta måste du skydda din webhook med Microsoft Entra-autentisering. Mer information finns i Leverera händelser till Microsoft Entra-skyddade slutpunkter.

  • Eller så kan du verifiera prenumerationen manuellt genom att skicka en GET-begäran till validerings-URL:en. Händelseprenumerationen förblir i ett väntande tillstånd tills den har verifierats. Validerings-URL:en använder port 553. Om brandväggsreglerna blockerar port 553 måste du uppdatera reglerna för en lyckad manuell handskakning.

    Om du identifierar att det inte är en händelseprenumeration som du förväntar dig händelser för i valideringen av prenumerationen returnerar du inte ett svar på 200 eller inget svar alls. Valideringen misslyckas därför.

Ett exempel på hur du hanterar handskakningen för prenumerationsverifiering finns i ett C#-exempel.

Slutpunktsverifiering med CloudEvents v1.0

CloudEvents v1.0 implementerar sin egen semantik för missbruksskydd med hjälp av metoden HTTP OPTIONS . Du kan läsa mer om det här. När du använder CloudEvents-schemat för utdata använder Event Grid CloudEvents v1.0-missbruksskydd i stället för event grid-valideringshändelsemekanismen.

Kompatibilitet för händelseschema

När ett ämne skapas definieras ett inkommande händelseschema. Och när en prenumeration skapas definieras ett utgående händelseschema. I följande tabell visas den kompatibilitet som tillåts när du skapar en prenumeration.

Inkommande händelseschema Schema för utgående händelse Stöds
Event Grid-schema Event Grid-schema Ja
Cloud Events v1.0-schema Ja
Anpassat indataschema Nej
Cloud Events v1.0-schema Event Grid-schema Nej
Cloud Events v1.0-schema Ja
Anpassat indataschema Nej
Anpassat indataschema Event Grid-schema Ja
Cloud Events v1.0-schema Ja
Anpassat indataschema Ja

Nästa steg

I följande artikel får du lära dig hur du felsöker valideringar av händelseprenumerationer: Felsöka valideringar av händelseprenumerationer.