Pengiriman kejadian webhook
Webhook adalah salah satu dari banyak cara untuk menerima acara dari Azure Event Grid. Ketika peristiwa baru siap, layanan Event Grid memPOST permintaan HTTP ke titik akhir yang dikonfigurasi dengan informasi peristiwa di isi permintaan.
Seperti banyak layanan lain yang mendukung webhook, Event Grid mengharuskan Anda membuktikan kepemilikan titik akhir Webhook Anda sebelum mulai mengirimkan acara ke titik akhir tersebut. Persyaratan ini mencegah pengguna berbahaya membanjiri titik akhir Anda dengan acara.
Validasi Titik Akhir dengan acara Event Grid
Saat Anda menggunakan salah satu dari tiga layanan Azure berikut, infrastruktur Azure secara otomatis menangani validasi ini:
- Azure Logic Apps dengan Konektor Event Grid
- Azure Automation melalui webhook
- Azure Functions dengan Pemicu Event Grid
Jika menggunakan jenis titik akhir lainnya, seperti fungsi Azure berbasis pemicu HTTP, kode titik akhir Anda perlu berpartisipasi dalam jabat tangan validasi dengan Event Grid. Event Grid mendukung dua cara untuk memvalidasi langganan.
Jabat tangan sinkron: Pada saat pembuatan langganan peristiwa, Event Grid mengirimkan peristiwa validasi langganan ke titik akhir Anda. Skema acara ini mirip dengan acara Event Grid lainnya. Bagian data acara ini mencakup properti
validationCode
. Aplikasi Anda memverifikasi bahwa permintaan validasi adalah untuk langganan acara yang diharapkan, dan membalas kode validasi sebagai respons secara sinkron. Mekanisme jabat tangan ini didukung di semua versi Event Grid.Jabat tangan asinkron: Dalam kasus tertentu, Anda tidak dapat membalas
validationCode
sebagai respons secara sinkron. Misalnya, jika Anda menggunakan layanan pihak ketiga (sepertiZapier
atau IFTTT), Anda tidak dapat merespons secara terprogram dengan kode validasi.Event Grid mendukung jabat tangan validasi manual. Jika Anda membuat langganan acara dengan SDK atau alat yang menggunakan API versi 2018-05-01-preview atau yang lebih baru, Event Grid akan mengirimkan properti
validationUrl
di bagian data acara validasi langganan. Untuk menyelesaikan jabat tangan, temukan URL itu di data acara, lalu lakukan permintaan DAPATKAN ke URL tersebut. Anda dapat menggunakan klien REST atau browser web.URL yang disediakan berlaku selama 10 menit. Selama durasi tersebut, status penyediaan langganan acara adalah
AwaitingManualAction
. Jika Anda tidak menyelesaikan validasi manual dalam waktu 10 menit, status provisi diatur keFailed
. Anda harus membuat langganan peristiwa lagi sebelum memulai validasi manual.Mekanisme autentikasi ini juga mengharuskan titik akhir webhook membalas kode status HTTP 200 sehingga tahu bahwa KIRIMAN untuk acara validasi tersebut diterima sebelum dapat dimasukkan ke dalam mode validasi manual. Dengan kata lain, jika titik akhir membalas 200 tetapi tidak membalas respons validasi secara sinkron, mode tersebut dialihkan ke mode validasi manual. Jika ada GET pada URL validasi dalam waktu 10 menit, jabat tangan validasi dianggap berhasil.
Catatan
Menggunakan sertifikat yang ditandatangani sendiri untuk validasi tidak didukung. Gunakan sertifikat yang ditandatangani otoritas sertifikat komersial (CA) sebagai gantinya.
Detail validasi
- Pada saat pembuatan/pembaruan langganan acara, Event Grid memposting acara validasi langganan ke titik akhir target.
- Peristiwa berisi nilai header
aeg-event-type: SubscriptionValidation
. - Isi acara memiliki skema yang sama dengan acara Event Grid lainnya.
- Properti
eventType
dari peristiwa tersebut adalahMicrosoft.EventGrid.SubscriptionValidationEvent
. - Properti
data
dari peristiwa tersebut mencantumkanvalidationCode
properti dengan untai (karakter) yang dihasilkan secara acak. Contohnya,validationCode: acb13…
. - Data acara juga menyertakan properti
validationUrl
dengan URL untuk memvalidasi langganan secara manual. - Larik hanya berisi acara validasi. Acara lain dikirim dalam permintaan terpisah setelah Anda membalas kode validasi.
- SDK EventGrid DataPlane memiliki kelas yang sesuai dengan data peristiwa validasi langganan dan respons validasi langganan.
Contoh SubscriptionValidationEvent ditunjukkan dalam contoh berikut:
[
{
"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"
}
]
Untuk membuktikan kepemilikan titik akhir, balas kode validasi di dalam validationResponse
properti validationResponse, seperti yang ditunjukkan dalam contoh berikut:
{
"validationResponse": "512d38b6-c7b8-40c8-89fe-f46f9e9622b6"
}
Dan, ikuti salah satu langkah berikut:
Anda harus membalas kode status respons HTTP 200 OK. HTTP 202 Diterima tidak dikenali sebagai respons validasi langganan Event Grid yang valid. Permintaan HTTP harus diselesaikan dalam waktu 30 detik. Jika tidak selesai dalam 30 detik, maka operasi tersebut akan dibatalkan dan akan dicoba ulang setelah 5 detik. Jika semua upaya gagal, maka itu diperlakukan sebagai kesalahan jabat tangan validasi.
Fakta bahwa aplikasi Anda siap untuk menangani dan mengembalikan kode validasi menunjukkan bahwa Anda membuat langganan peristiwa dan diharapkan menerima peristiwa tersebut. Bayangkan skenario bahwa tidak ada validasi jabat tangan yang didukung dan peretas mengenal URL aplikasi Anda. Peretas dapat membuat topik dan langganan peristiwa dengan URL aplikasi Anda, dan mulai melakukan serangan DoS ke aplikasi Anda dengan mengirim banyak peristiwa. Validasi jabat tangan mencegah hal itu terjadi.
Bayangkan bahwa Anda sudah memiliki validasi yang diterapkan di aplikasi Anda karena Anda membuat langganan peristiwa Anda sendiri. Bahkan jika peretas membuat langganan peristiwa dengan URL aplikasi Anda, implementasi peristiwa permintaan validasi yang benar memeriksa
aeg-subscription-name
header dalam permintaan untuk memastikan bahwa itu adalah langganan peristiwa yang Anda kenali.Bahkan setelah implementasi jabat tangan yang benar, peretas dapat membanjiri aplikasi Anda (sudah memvalidasi langganan peristiwa) dengan mereplikasi permintaan yang tampaknya berasal dari Event Grid. Untuk mencegahnya, Anda harus mengamankan webhook Anda dengan autentikasi Microsoft Entra. Untuk informasi selengkapnya, lihat Mengirimkan peristiwa ke titik akhir yang dilindungi Microsoft Entra.
Atau, Anda dapat memvalidasi langganan secara manual dengan mengirim permintaan DAPATKAN ke URL validasi. Langganan acara tetap dalam status tertunda hingga divalidasi. Url validasi menggunakan port 553. Jika aturan firewall Anda memblokir port 553, Anda perlu memperbarui aturan untuk jabat tangan manual yang berhasil.
Dalam validasi peristiwa validasi langganan, jika Anda mengidentifikasi bahwa itu bukan langganan peristiwa yang Anda harapkan peristiwanya, Anda tidak akan mengembalikan respons 200 atau tidak ada respons sama sekali. Oleh karena itu, validasi gagal.
Untuk contoh penanganan jabat tangan validasi langganan, lihat sampel C#.
Validasi titik akhir dengan CloudEvents v1.0
CloudEvents v1.0 mengimplementasikan semantik perlindungan penyalahgunaannya sendiri menggunakan metode OPSI HTTP. Baca lebih lanjut mengenai hal tersebut di sini. Saat Anda menggunakan skema CloudEvents untuk output, Event Grid menggunakan perlindungan penyalahgunaan CloudEvents v1.0 sebagai menggantikan mekanisme peristiwa validasi Event Grid.
Kompatibilitas skema peristiwa
Ketika topik dibuat, skema peristiwa yang akan masuk ditentukan. Lalu, ketika langganan dibuat, skema peristiwa yang akan keluar ditentukan. Tabel berikut menunjukkan kompatibilitas yang diizinkan saat membuat langganan.
Skema peristiwa masuk | Skema peristiwa keluar | Didukung |
---|---|---|
Skema Azure Event Grid | Skema Azure Event Grid | Ya |
Skema Cloud Events v1.0 | Ya | |
Skema input kustom | No | |
Skema Cloud Events v1.0 | Skema Azure Event Grid | No |
Skema Cloud Events v1.0 | Ya | |
Skema input kustom | No | |
Skema input kustom | Skema Azure Event Grid | Ya |
Skema Cloud Events v1.0 | Ya | |
Skema input kustom | Ya |
Langkah berikutnya
Lihat artikel berikut ini untuk mempelajari cara memecahkan masalah validasi langganan peristiwa: Memecahkan masalah validasi langganan peristiwa.