Проверка не требуется строго для подписки на Event Grid?

В документации для Azure Event Grid написано

Ваше приложение должно ответить, повторив код подтверждения. Сетка событий не доставляет события в конечные точки WebHook, которые не прошли проверку.

Я создал свою функцию WebHook Azure, которая просто одобряет любой запрос POST без кода проверки. Тем не менее, я до сих пор вижу отправленные на эту конечную точку пользовательские события.

Почему в этом случае строго не требуется проверка?

2 ответа

Решение

Обмен токенами происходит за кулисами для функций Azure, поэтому вам не нужно возвращать код проверки. То же самое относится и к приложениям логики.

Если вы используете функцию Azure на основе "Сетка событий" в качестве места назначения подписки на событие, проверка подписки обрабатывается автоматически. Начиная с версии API 2018-01-01, если вы используете функцию, основанную на "триггере HTTP" (в качестве конечной точки назначения при создании подписки на событие), вам потребуется обработать эту проверку в своем коде. Это задокументировано по адресу https://docs.microsoft.com/en-us/azure/event-grid/overview.

Вот пример кода на C#:

Шаг 1. Добавление зависимости в Microsoft.Azure.EventGrid. Для этого нажмите ссылку "Просмотр файлов" в своей функции Azure (в правой части панели на портале функций Azure) и создайте файл с именем project.json. Добавьте следующее содержимое в файл project.json и сохраните его:

{
    "frameworks": {
        "net46": {
            "dependencies": {
               "Microsoft.Azure.EventGrid": "1.1.0-preview"
             }
         }
     }
}

Шаг 2. Обработка события проверки подписки:

using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using Microsoft.Azure.EventGrid.Models;

class SubscriptionValidationEventData
{
    public string ValidationCode { get; set; }
}

class SubscriptionValidationResponseData
{
    public string ValidationResponse { get; set; }
}

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,  TraceWriter log)
{
    string response = string.Empty;
    const string SubscriptionValidationEvent  = "Microsoft.EventGrid.SubscriptionValidationEvent";

    string requestContent = await req.Content.ReadAsStringAsync();
    EventGridEvent[] eventGridEvents = JsonConvert.DeserializeObject<EventGridEvent[]>(requestContent);

    foreach (EventGridEvent eventGridEvent in eventGridEvents)
    {
        JObject dataObject = eventGridEvent.Data as JObject;

        // Deserialize the event data into the appropriate type based on event type
        if (string.Equals(eventGridEvent.EventType, SubscriptionValidationEvent, StringComparison.OrdinalIgnoreCase))
        {
            var eventData = dataObject.ToObject<SubscriptionValidationEventData>();
            log.Info($"Got SubscriptionValidation event data, validation code {eventData.ValidationCode}, topic={eventGridEvent.Topic}");
            // Do any additional validation (as required) and then return back the below response
            var responseData = new SubscriptionValidationResponseData();
            responseData.ValidationResponse = eventData.ValidationCode;
            return req.CreateResponse(HttpStatusCode.OK, responseData);   
        }            
    }

    return req.CreateResponse(HttpStatusCode.OK, response);    
}
Другие вопросы по тегам