Solucionar falhas de validação de subscrição no Grade de Eventos do Azure

Ao criar uma assinatura de evento do Event Grid para um endpoint webhook, o Event Grid deve confirmar que você é o dono do endpoint antes que ele entregue eventos. Se esse aperto de mão de validação não for concluído, a criação da assinatura falha. Este artigo ajuda você a identificar por que o aperto de mão falha e como consertar isso.

Symptoms

Quando você cria uma assinatura de evento, você vê uma mensagem de erro semelhante ao texto a seguir:

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 completar o handshake de validação com seu endpoint webhook, então o Event Grid não cria a assinatura.

Cause

O Event Grid exige que você prove a propriedade de um endpoint webhook antes de começar a entregar eventos. Esse requisito impede que um usuário malicioso inunde um endpoint com eventos. O erro de validação aparece quando o handshake entre o Event Grid e seu endpoint não tem sucesso. As causas mais comuns incluem:

  • Seu endpoint não retorna o código de validação do handshake síncrono, ou não retorna 200 OK para o handshake assíncrono (manual).
  • Um firewall, Gateway de Aplicativo do Azure ou firewall de aplicações web (WAF) na frente do seu endpoint bloqueia a solicitação de validação e retorna 403 (Forbidden).
  • Seu endpoint usa o esquema CloudEvents v1.0, mas não responde à solicitação de validação HTTP OPTIONS .
  • Seu endpoint usa um certificado autoassinado, 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 assinatura com esquema do Event Grid

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

  1. Envie uma requisição HTTP POST para a URL do seu webhook com um corpo de requisição de exemplo SubscriptionValidationEvent usando curl ou uma ferramenta similar.
  2. Se seu webhook implementar o handshake síncrono, verifique se seu webhook retorna o validationCode na resposta. Você deve retornar um código de status HTTP 200 OK. A Grade de Eventos não reconhece HTTP 202 Accepted como resposta válida, e a solicitação deve ser concluída em até 30 segundos.
  3. Se o seu webhook usar o handshake assíncrono (manual), verifique se o seu endpoint retorne 200 OK. Depois, conclua o handshake enviando uma solicitação GET para o validationUrl presente nos dados do evento em até 10 minutos. A URL de validação usa a porta 553, então atualize as regras do firewall se essa porta estiver bloqueada.

Aqui está um exemplo SubscriptionValidationEvent de carga útil JSON que você 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 esperada e bem-sucedida:

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

Aqui está o comando curl equivalente para validar uma assinatura de webhook que usa 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, veja Validação de endpoint com esquema de eventos Event Grid.

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

Se o seu webhook retornar 403 (Forbidden), verifique se ele está atrás de um Gateway de Aplicativo do Azure ou de um firewall de aplicativo web. Se estiver, desative as seguintes regras de firewall e faça o HTTP POST novamente:

  • 920300 (Falta cabeçalho de aceitação da solicitação)
  • 942430 (Detecção restrita de anomalia de caracteres SQL (args): número de caracteres especiais excedido (12))
  • 920230 (Várias codificações de URL detectadas)
  • 942130 (ataque de injeção SQL: tautologia SQL detectada)
  • 931130 (Possível ataque remoto de inclusão de arquivos (RFI): referência ou link fora do domínio)

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

Se sua assinatura usa o esquema CloudEvents v1.0, o Event Grid usa proteção contra abuso do CloudEvents em vez do evento de validação de assinatura. Seu endpoint deve responder ao método HTTP OPTIONS e retornar o WebHook-Allowed-Origin cabeçalho. Para saber mais, veja Validação de endpoint usando o esquema CloudEvents.

Se precisar de mais ajuda, faça sua pergunta na página de Perguntas e Respostas da Microsoft para o Event Grid ou abra um chamado de suporte.