Solucionar falhas de validação de subscrição em Azure Event Grid

Quando cria uma subscrição de eventos do Event Grid para um ponto final de webhook, o Event Grid tem de confirmar que o ponto final lhe pertence antes de enviar os eventos. Se esse aperto de mão de validação não for concluído, a criação da subscrição falha. Este artigo ajuda-o a identificar porque é que o aperto de mão falha e como o resolver.

Sintomas

Quando cria uma subscrição de evento, vê uma mensagem de erro semelhante ao texto seguinte:

The attempt to validate the provided endpoint https://your-endpoint-here failed. For more details, visit https://aka.ms/esvalidation

O erro indica que o Event Grid não conseguiu concluir o handshake de validação com o endpoint do webhook, por isso o Event Grid não cria a subscrição.

Cause

O Event Grid exige que prove a propriedade de um endpoint webhook antes de começar a entregar eventos. Este requisito impede que um utilizador malicioso inunde um endpoint com eventos. O erro de validação aparece quando o handshake entre a Event Grid e o teu endpoint não tem sucesso. As causas comuns incluem:

  • O seu endpoint não devolve o código de validação no handshake síncrono nem devolve 200 OK no handshake assíncrono (manual).
  • Um firewall, Gateway de Aplicação do Azure ou firewall de aplicações web (WAF) à frente do seu endpoint bloqueia o pedido de validação e devolve 403 (Forbidden).
  • O seu endpoint usa o esquema CloudEvents v1.0, mas não responde ao pedido de validação HTTP OPTIONS .
  • O seu endpoint usa um certificado auto-assinado, que o Event Grid não suporta para validação.

Para uma descrição completa do handshake de validação, veja Validação de endpoint com esquema de eventos Event Grid e validação de endpoint usando o esquema CloudEvents.

Solução 1: Testar o handshake de validação para uma subscrição de esquema Event Grid

Envie um exemplo de SubscriptionValidationEvent para o seu webhook e confirme a resposta:

  1. Envie um pedido POST HTTP para o URL do seu webhook com um corpo de pedido de exemplo SubscriptionValidationEvent, utilizando o curl ou uma ferramenta semelhante.
  2. Se o seu webhook implementar o handshake síncrono, verifique se o seu webhook devolve o validationCode na resposta. Deve devolver o código de estado HTTP 200 OK. O Event Grid não reconhece HTTP 202 Accepted como resposta válida, e o pedido deve ser concluído em 30 segundos.
  3. Se o seu webhook implementar o handshake assíncrono (manual), verifique se o seu endpoint retorna 200 OK. Depois, conclua o handshake enviando um pedido GET para o validationUrl nos dados do evento no prazo de 10 minutos. A URL de validação usa a porta 553, por isso atualiza as regras do firewall se essa porta estiver bloqueada.

Aqui está um exemplo SubscriptionValidationEvent de carga útil JSON que pode enviar:

[
  {
    "id": "aaaa0000-bb11-2222-33cc-444444dddddd",
    "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "subject": "",
    "data": {
      "validationCode": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
    },
    "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime": "2018-01-25T22:12:19.4556811Z",
    "metadataVersion": "1",
    "dataVersion": "1"
  }
]

Aqui está a resposta bem-sucedida esperada:

{
  "validationResponse": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
}

Aqui está o comando curl equivalente para validar uma subscrição de webhook que utiliza o esquema de eventos Event Grid:

curl -X POST -d '[{"id": "aaaa0000-bb11-2222-33cc-444444dddddd","topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","subject": "","data": {"validationCode": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"},"eventType": "Microsoft.EventGrid.SubscriptionValidationEvent","eventTime": "2018-01-25T22:12:19.4556811Z", "metadataVersion": "1","dataVersion": "1"}]' -H 'Content-Type: application/json' https://{your-webhook-url.com}

Para saber mais, consulte Validação de endpoint com esquema de eventos da Grade de Eventos.

Solução 2: Remover regras de firewall ou WAF que bloqueiam o pedido de validação

Se o seu webhook devolver 403 (Forbidden), verifique se está por trás de um Gateway de Aplicação do Azure ou de um firewall de aplicações Web. Se for, desative as seguintes regras de firewall e faça novamente o HTTP POST:

  • 920300 (Pedido sem um cabeçalho Accept)
  • 942430 (Deteção restrita de anomalias de caracteres SQL (args): número de caracteres especiais excedido (12))
  • 920230 (Codificação de URL múltipla detetada)
  • 942130 (ataque de injeção SQL: tautologia SQL detetada)
  • 931130 (Possível ataque remoto de inclusão de ficheiros (RFI): referência ou ligação fora do domínio)

Solução 3: Validar uma subscrição de esquema CloudEvents

Se a sua subscrição usar o esquema CloudEvents v1.0, o Event Grid utiliza proteção contra abusos do CloudEvents em vez do evento de validação da subscrição. O seu endpoint deve responder ao método HTTP OPTIONS e devolver o WebHook-Allowed-Origin cabeçalho. Para saber mais, consulte Validação de endpoint usando o esquema CloudEvents.

Se precisares de mais ajuda, faz a tua pergunta na página de Perguntas e Respostas da Microsoft para o Event Grid ou abre um ticket de suporte.