Doručení událostí webhooku

Webhooky představují jeden z mnoha způsobů, jak přijímat události z Azure Event Gridu. Jakmile je nová událost připravená, služba Event Grid odešle požadavek HTTP na nakonfigurovaný koncový bod s informacemi o události v textu požadavku.

Stejně jako řada dalších služeb, které podporují webhooky, služba Event Grid vyžaduje, abyste před zahájením doručování událostí do tohoto koncového bodu prokázali vlastnictví koncového bodu webhooku. Tento požadavek brání škodlivému uživateli v zahlcení koncového bodu událostmi.

Ověření koncového bodu s využitím událostí Event Gridu

Když použijete některou z následujících tří služeb Azure, infrastruktura Azure toto ověření automaticky zpracuje:

Pokud používáte jakýkoli jiný typ koncového bodu, například funkci Azure založenou na triggeru HTTP, musí se kód koncového bodu účastnit ověřovací metody handshake s Event Gridem. Event Grid podporuje dva způsoby ověřování předplatného.

  • Synchronní metodu handshake: V době vytváření odběru událostí odešle Event Grid událost ověření odběru do koncového bodu. Schéma této události se podobá jakékoli jiné události Event Gridu. Datová část této události zahrnuje validationCode vlastnost. Vaše aplikace ověří, že požadavek na ověření je určený pro očekávané odběry událostí, a synchronně vrátí ověřovací kód v odpovědi. Tento mechanismus handshake je podporován ve všech verzích služby Event Grid.

  • Asynchronní handshake: V některých případech nemůžete synchronně vrátit validationCode odpověď v odpovědi. Pokud například používáte službu třetí strany (například Zapier NEBO IFTTT), nemůžete programově odpovědět ověřovacím kódem.

    Event Grid podporuje metodu handshake ručního ověření. Pokud vytváříte odběr událostí pomocí sady SDK nebo nástroje, který používá rozhraní API verze 2018-05-01-preview nebo novější, Event Grid odešle validationUrl vlastnost v datové části události ověření odběru. Pokud chcete metodu handshake dokončit, najděte tuto adresu URL v datech události a proveďte na ni požadavek GET. Můžete použít klienta REST nebo webový prohlížeč.

    Zadaná adresa URL je platná 10 minut. Během této doby je AwaitingManualActionstav zřizování odběru událostí . Pokud ruční ověření nedokončíte do 10 minut, nastaví se stav zřizování na Failedhodnotu . Před zahájením ručního ověření musíte znovu vytvořit odběr události.

    Tento ověřovací mechanismus také vyžaduje, aby koncový bod webhooku vracel stavový kód HTTP 200, aby věděl, že post pro ověřovací událost byl přijat dříve, než ho lze vložit do režimu ručního ověření. Jinými slovy, pokud koncový bod vrátí hodnotu 200, ale nevrací synchronně ověřovací odpověď, režim se přepočítá do režimu ručního ověření. Pokud je na adrese URL ověření během 10 minut get, ověření metody handshake se považuje za úspěšné.

Poznámka:

Použití certifikátů podepsaných svým držitelem k ověření se nepodporuje. Místo toho použijte podepsaný certifikát od komerční certifikační autority (CA).

Podrobnosti o ověření

  • V době vytvoření nebo aktualizace odběru událostí služba Event Grid publikuje událost ověření odběru do cílového koncového bodu.
  • Událost obsahuje hodnotu aeg-event-type: SubscriptionValidationzáhlaví .
  • Tělo události má stejné schéma jako ostatní události Event Gridu.
  • Vlastnost eventType události je Microsoft.EventGrid.SubscriptionValidationEvent.
  • Vlastnost data události zahrnuje validationCode vlastnost s náhodně vygenerovaným řetězcem. Například validationCode: acb13….
  • Data události také obsahují validationUrl vlastnost s adresou URL pro ruční ověření odběru.
  • Pole obsahuje pouze ověřovací událost. Další události se odesílají v samostatném požadavku po vrácení ověřovacího kódu.
  • Sady SDK roviny dat EventGrid mají třídy odpovídající datům události ověření odběru a odpovědi na ověření odběru.

Příklad SubscriptionValidationEvent je znázorněn v následujícím příkladu:

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

Pokud chcete prokázat vlastnictví koncového bodu, vraťte ověřovací kód ve validationResponse vlastnosti, jak je znázorněno v následujícím příkladu:

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

A postupujte podle jednoho z těchto kroků:

  • Je nutné vrátit stavový kód odpovědi HTTP 200 OK . Protokol HTTP 202 Accepted není rozpoznán jako platná odpověď na ověření odběru služby Event Grid. Požadavek HTTP se musí dokončit do 30 sekund. Pokud se operace nedokončí do 30 sekund, operace se zruší a může se znovu načíst po 5 sekundách. Pokud všechny pokusy selžou, považuje se za chybu metody handshake ověření.

    Skutečnost, že vaše aplikace je připravená zpracovat a vrátit ověřovací kód, značí, že jste vytvořili odběr události a očekávali přijetí události. Představte si scénář, že se nepodporuje ověřování metodou handshake a hacker se seznámí s adresou URL vaší aplikace. Hacker může vytvořit téma a odběr událostí s adresou URL vaší aplikace a začít provádět útok DoS na vaši aplikaci odesláním velkého množství událostí. Ověření metody handshake brání tomu, aby k tomu došlo.

    Představte si, že už máte ve své aplikaci implementované ověřování, protože jste vytvořili vlastní odběry událostí. I když hacker vytvoří odběr událostí s adresou URL vaší aplikace, vaše správná implementace události žádosti o ověření zkontroluje aeg-subscription-name hlavičku v požadavku, aby se ověřilo, že se jedná o odběr událostí, které rozpoznáte.

    I po správné implementaci metody handshake může hacker zahltit vaši aplikaci (už ověřil odběr události) tím, že replikuje požadavek, který vypadá, že pochází z Event Gridu. Abyste tomu zabránili, musíte webhook zabezpečit pomocí ověřování Microsoft Entra. Další informace najdete v tématu Doručování událostí do koncových bodů chráněných microsoftem Entra.

  • Nebo můžete předplatné ručně ověřit odesláním požadavku GET na adresu URL ověření. Odběr události zůstane ve stavu čekání na vyřízení, dokud se neověří. Ověřovací adresa URL používá port 553. Pokud pravidla brány firewall blokují port 553, musíte aktualizovat pravidla pro úspěšné ruční použití handshake.

    Pokud při ověřování události ověření odběru zjistíte, že se nejedná o odběr událostí, u kterého očekáváte události, nevrátíte odpověď 200 nebo vůbec žádnou odpověď. Ověření se proto nezdaří.

Příklad zpracování metody handshake ověření předplatného najdete v ukázce jazyka C#.

Ověření koncového bodu pomocí CloudEvents v1.0

CloudEvents v1.0 implementuje vlastní sémantiku ochrany před zneužitím pomocí metody HTTP OPTIONS . Další informace si můžete přečíst tady. Když pro výstup použijete schéma CloudEvents, služba Event Grid místo mechanismu událostí ověření služby Event Grid používá ochranu před zneužitím CloudEvents v1.0.

Kompatibilita schématu událostí

Při vytvoření tématu je definováno schéma příchozí události. Při vytvoření odběru je definováno schéma odchozích událostí. Následující tabulka ukazuje kompatibilitu povolenou při vytváření předplatného.

Schéma příchozích událostí Schéma odchozích událostí Podporováno
Schéma služby Event Grid Schéma služby Event Grid Ano
Schéma cloudových událostí v1.0 Ano
Vlastní schéma vstupu No
Schéma cloudových událostí v1.0 Schéma služby Event Grid No
Schéma cloudových událostí v1.0 Ano
Vlastní schéma vstupu No
Vlastní schéma vstupu Schéma služby Event Grid Ano
Schéma cloudových událostí v1.0 Ano
Vlastní schéma vstupu Ano

Další kroky

V následujícím článku se dozvíte, jak řešit potíže s ověřováním odběru událostí: Řešení potíží s ověřováním odběru událostí.