Compartir por


Autenticación con el corredor MQTT mediante autenticación de webhook personalizada

Este artículo muestra cómo autenticarse con los espacios de nombres de Azure Event Grid mediante un webhook o una función de Azure.

La autenticación de webhooks permite que los puntos de conexión HTTP externos (webhooks o funciones) autentiquen las conexiones de transporte de telemetría de colas de mensajes (MQTT) de forma dinámica. Este método utiliza la validación de JSON Web Token de Microsoft Entra ID para garantizar un acceso seguro.

Cuando un cliente intenta conectarse, el intermediario invoca un punto de conexión HTTP definido por el usuario que valida las credenciales, como los tokens de Firma de acceso compartido, los nombres de usuario y las contraseñas, o incluso realiza comprobaciones de la lista de revocación de certificados. El webhook evalúa la solicitud y devuelve una decisión para permitir o denegar la conexión, junto con metadatos opcionales para la autorización específica. Este enfoque admite directivas de autenticación flexibles y centralizadas en diversas flotas de dispositivos y casos de uso.

Prerrequisitos

  • Un espacio de nombres de Event Grid con una identidad administrada asignada por el sistema o asignada por el usuario.
  • Un webhook externo o una función de Azure.
  • Acceso concedido a la identidad administrada del espacio de nombres de Event Grid a la función de Azure o webhook.

Pasos a nivel macro

Para usar la autenticación de webhook personalizada para los espacios de nombres, siga estos pasos:

  1. Cree un espacio de nombres y configure sus subrecursos.
  2. Habilite una identidad administrada en el espacio de nombres de Event Grid.
  3. Conceda a la identidad administrada acceso a la función o webhook de Azure.
  4. Configure los valores de webhook personalizados en el espacio de nombres de Event Grid.
  5. Conecte los clientes al espacio de nombres de Event Grid y autentíquese a través del webhook o la función.

Cree un espacio de nombres y configure sus subrecursos

Para crear un espacio de nombres y configurar sus subrecursos, siga las instrucciones de Inicio rápido: Publicación y suscripción a mensajes MQTT en un espacio de nombres de Event Grid con Azure Portal. Omita los pasos para crear un certificado y un cliente porque las identidades de cliente proceden del token proporcionado. Los atributos de cliente se basan en las notificaciones personalizadas del token de cliente. Los atributos de cliente se usan en la consulta del grupo de clientes, las variables de plantilla de tema y la configuración de enriquecimiento de enrutamiento.

Habilitación de una identidad administrada en el espacio de nombres de Event Grid

Para habilitar una identidad administrada asignada por el sistema en su espacio de nombres de Event Grid, use el siguiente comando:

az eventgrid namespace update --resource-group <resource group name> --name <namespace name> --identity "{type:systemassigned}" 

Para obtener información sobre cómo configurar las identidades asignadas al sistema y a los usuarios mediante Azure Portal, consulte Habilitar la identidad administrada para un espacio de nombres de Event Grid.

Implementaciones

Opción 1: implementación de Webhook mediante Azure Functions (Aplicación Microsoft Entra)

Azure Functions puede hospedar la lógica de webhook mediante Microsoft.Identity.Web para validar el token automáticamente. Se requiere un registro de aplicación de Microsoft Entra para la API de Webhook con el fin de validar los tokens de llamada de Event Grid, el cual debe contar con un URI del identificador de aplicación para la emisión de tokens. El lado cliente (Event Grid) ya tiene identidad administrada.

Ventajas:

  • Sin infraestructura para administrar
  • Asistentes de autenticación integrados (Microsoft.Identity.Web)
  • Durable, escalable y rentable

La función debe realizar las siguientes operaciones:

  • Validación del token del autor de la llamada desde la identidad administrada de Event Grid
  • Validar el Json Web Token (JWT) del cliente
  • Devolución de un JSON de permitir o denegar

Opción 2: Implementación de punto de conexión HTTPS externo

Esta implementación puede ser cualquier punto de conexión HTTPS externo (cualquier nube o cualquier back-end), utilizando la validación de JWT de Microsoft Entra ID con bibliotecas Microsoft.IdentityModel.

Use cualquier entorno de ejecución: .NET/Node/Java/Python.

Requisitos clave:

  • Debe ser HTTPS.

  • Debe validar el JWT del autor de la llamada

  • Debe validar el JWT del dispositivo

  • Debe responder dentro del tiempo de espera (se recomienda aproximadamente 5 segundos)

    Diagrama que muestra implementaciones de webhook personalizadas.

Concesión de acceso adecuado a la identidad administrada a una función o webhook

Conceda a la identidad administrada del espacio de nombres de Event Grid un acceso adecuado a la función de Azure de destino o al webhook.

Para configurar la autenticación personalizada para una función de Azure, siga los pasos siguientes.

Crear una aplicación de Microsoft Entra

  1. Cree una aplicación Microsoft Entra en Microsoft Entra ID.

  2. En la página de Información general de la aplicación, anote el valor de Id. de la aplicación (cliente).

    Recorte de pantalla que muestra la página de información general de una aplicación de Microsoft Entra ID con el id. de la aplicación (cliente) resaltado.

  3. En el menú de la izquierda, seleccione Exponer una API. Junto a URI de identificador de aplicación, seleccione Agregar.

  4. Anote el valor de URI de id. de la aplicación en el panel Editar URI de id. de la aplicación y, a continuación, seleccione Guardar.

    Recorte de pantalla que muestra el URI de identificación de la aplicación de Microsoft Entra.

Configuración de la autenticación para una función de Azure

Si tiene una función básica de Azure creada desde Azure Portal, configure la autenticación y valide el token de Microsoft Entra ID que se creó utilizando una identidad gestionada.

  1. Vaya a la aplicación de Azure Functions.

  2. En el menú de la izquierda, seleccione Autenticación y, a continuación, seleccione Agregar proveedor de identidades.

    Recorte de pantalla que muestra la página de autenticación.

  3. En la página Añadir un proveedor de identidad, para Proveedor de identidad, seleccione Microsoft de la lista desplegable.

  4. En la sección Registro de aplicaciones, especifique los valores de las siguientes propiedades:

    1. Id. de aplicación (cliente): introduzca el id. de cliente de la aplicación de Microsoft Entra que anotó anteriormente.

    2. Dirección URL del emisor: agregue la dirección URL del emisor con el formato https://login.microsoftonline.com/<tenantid>/v2.0.

      Recorte de pantalla que muestra la opción Agregar un proveedor de identidades con Microsoft como proveedor de identidades.

  5. En la sección Audiencias permitidas por token, introduzca las audiencias permitidas por token. Para ser específico, escriba el URI de identificador de aplicación de la aplicación Microsoft Entra que anotó anteriormente. La audiencia del token se usa para validar el token entrante de Event Grid.

  6. En la sección Comprobaciones adicionales , siga estos pasos:

    1. En Requisitos de la aplicación cliente, seleccione Solicitudes permitidas de aplicaciones cliente específicas y, a continuación, escriba el identificador de aplicación que anotó anteriormente.

    2. En Requisito de identidad, seleccione Permitir solicitudes de cualquier identidad.

      Captura de pantalla que muestra la opción Agregar un proveedor de identidades con audiencia de tokens y comprobaciones adicionales.

  7. En la sección Configuración de autenticación de App Service , siga estos pasos:

    1. En Restringir acceso, seleccione Requerir autenticación.

    2. En Solicitudes no autenticadas, seleccione Devolver HTTP 401 No autorizado.

      Captura de pantalla que muestra la configuración de autenticación de App Service.

  8. Elija otras opciones de configuración en función de sus requisitos específicos y, a continuación, seleccione Agregar.

Generar y utilizar el token de ID de Microsoft Entra

Ahora, genere y use el token de id. de Microsoft Entra.

  1. Genere un token de identificación de Microsoft Entra usando la identidad administrada con el URI de identificador de aplicación (api://<ClientID>) como recurso.
  2. Use este token para invocar la función de Azure incluyándola en el encabezado de solicitud.

Configuración de la autenticación de webhook personalizada en el espacio de nombres de Event Grid

Configure los ajustes de autenticación de webhook personalizados en su espacio de nombres de Event Grid utilizando Azure Portal y la CLI de Azure. Primero se crea el espacio de nombres y, a continuación, se actualiza.

Uso de Azure Portal

  1. Vaya a su espacio de nombres de Event Grid enAzure Portal.

  2. En la página Espacio de nombres de Event Grid, seleccione Configuración en el menú de la izquierda.

  3. En la sección Autenticación de webhook personalizado, especifique los valores de las siguientes propiedades:

    1. Tipo de identidad administrada: seleccione Usuario asignado.
    2. Dirección URL del webhook: escriba el valor del punto de conexión de dirección URL donde el servicio de Event Grid envía solicitudes de webhook autenticadas mediante la identidad administrada especificada.
    3. URI de token de audiencia: introduzca el valor del id. de aplicación de Microsoft Entra o URI para obtener el token de acceso que se incluirá como token de portador en las solicitudes de entrega.
    4. Id. de inquilino de Microsoft Entra ID: escriba el valor del identificador de inquilino de Microsoft Entra que se usa para adquirir el token de portador para la entrega de webhook autenticada.
  4. Selecciona Aplicar.

    Captura de pantalla que muestra la configuración de la autenticación de webhook para un espacio de nombres de Event Grid.

Uso de la CLI de Azure

Para actualizar su espacio de nombres con la configuración de autenticación de webhook personalizada, use el siguiente comando:

az eventgrid namespace update \ 
    --resource-group <resource-group-name> \ 
    --name <namespace-name> \ 
    --api-version 2025-04-01-preview \ 
    --identity-type UserAssigned \ 
    --identity-user-assigned-identities "/subscriptions/XXXXXXXXXXX/resourcegroups/XXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/XXXXXXXXXXX={}" \ 
    --set properties.isZoneRedundant=true \ 
        properties.topicSpacesConfiguration.state=Enabled \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.identity.type=UserAssigned \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.identity.userAssignedIdentity="/subscriptions/XXXXXXXXXXX/resourcegroups/XXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/XXXXXXXXXXX" \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.endpointUrl="https://XXXXXXXXXXX" \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.azureActiveDirectoryApplicationIdOrUri="api://XXXXXXXXXXX/.default" \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.azureActiveDirectoryTenantId="XXXXXXXXXXX" 

Reemplace <NAMESPACE_NAME> y <RESOURCE_GROUP_NAME> por sus valores reales. Rellene los marcadores de posición de la suscripción, el grupo de recursos, la identidad, el id. de la aplicación, la URL y el id. del inquilino. Para mejorar el rendimiento y la fiabilidad de la autenticación basada en webhooks para el corredor MQTT de Event Grid, le recomendamos encarecidamente que habilite la compatibilidad con HTTP/2 para su punto de conexión de webhook.

Detalles de la API de webhook

Encabezados de solicitud

Azure Event Grid envía los siguientes encabezados en la solicitud al webhook:

**Authorization**: Bearer token

El token es un token de Microsoft Entra para la identidad administrada que se configuró para llamar al webhook.

Carga de solicitud

{
    "clientId": "<string>",
    "userName": "<string>",
    "password": "<base64 encoded bytes>",
    "authenticationMethod": "<string>",
    "authenticationData": "<base64 encoded bytes>",
    "clientCertificate": "<certificate in PEM format>",
    "clientCertificateChain": "<certificates from chain in PEM format>"
}

Descripciones de campos de carga

Campo Obligatorio/opcional Descripción
clientId Obligatorio Id. de cliente del paquete MQTT CONNECT.
userName Opcional Nombre de usuario del paquete MQTT CONNECT.
password Opcional Contraseña del paquete MQTT CONNECT en codificación Base64.
authenticationMethod Opcional Método de autenticación del paquete MQTT CONNECT (solo MQTT5).
authenticationData Opcional Datos de autenticación del paquete MQTT CONNECT en codificación Base64 (solo MQTT5).
clientCertificate Opcional Certificado de cliente en formato Privacy-Enhanced Mail (PEM).
clientCertificateChain Opcional Otros certificados proporcionados por el cliente necesarios para compilar la cadena desde el certificado de cliente al certificado de entidad de certificación.

Carga de respuesta

Respuesta exitosa

HTTP/1.1 200 OK 
Content-Type: application/json 

{ 
    "decision": "allow", 
    "clientAuthenticationName": "<string>", 
    "attributes": { 
        "attr": "<int/string/array_of_strings>", 
        ... 
    }, 
    "expiration": "<unix time format>" 
} 

Respuesta denegada

HTTP/1.1 200 Bad Request 
Content-Type: application/json 

{ 
    "decision": "deny", 
    "errorReason": "<string>" 
}

Códigos de error:

Resultado de la autenticación Respuesta de la función Código de razón MQTT de Event Grid
Denegación de autorización explícita "decision": "deny" No autorizado
Token no válido o expirado "decision": "deny" No autorizado
Tiempo de espera de la función N/A Servidor no disponible
Excepción de función / fallo N/A Servidor no disponible
Error transitorio de la plataforma N/A Servidor no disponible
Error interno de procesamiento del corredor N/A Servidor no disponible

Descripciones de campos de respuesta

Campo Descripción
decision (obligatorio) La decisión de autenticación es allow o deny.
clientAuthenticationName Nombre de autenticación de cliente (nombre de identidad). (Obligatorio cuando decision se establece en allow).
attributes Diccionario con atributos. La clave es el nombre del atributo y el valor es un entero, cadena o matriz. (Opcional cuando decision se establece en allow).
expiration Fecha de expiración en formato de hora de Unix. (Opcional cuando decision se establece en allow).
errorReason Mensaje de error si decision está establecido en deny. Este error se registra. (Opcional cuando decision se establece en deny).

Ejemplos de tipos de atributos admitidos

"num_attr_pos": 1, 
"num_attr_neg": -1, 
"str_attr": "str_value", 
"str_list_attr": [ 
    "str_value_1", 
    "str_value_2" 
] 

Todos los tipos de datos correctos (número que se ajuste a <int32/string/array_of_strings>) se usan como atributos. En el ejemplo, las notificaciones num_attr_pos, num_attr_neg, str_attr y str_list_attr tienen tipos de datos correctos y se utilizan como atributos.