Compartir vía


Autenticación de clientes de Azure Event Grid mediante claves de acceso o firmas de acceso compartido (versión preliminar)

En este artículo se proporciona información sobre cómo autenticar clientes en temas de espacio de nombres de eventos de Azure, temas personalizados, dominios y espacios de nombres de asociados mediante clave de acceso o token deFirma de acceso compartido (SAS).

Importante

  • Autenticar y autorizar a usuarios o aplicaciones con identidades de Microsoft Entra proporciona una seguridad y facilidad de uso superiores en lo que respecta a la autenticación basada en claves y en firmas de acceso compartido (SAS). Con Microsoft Entra ID, no es preciso almacenar los secretos que se utilizan para la autenticación en el código y arriesgarse a posibles vulnerabilidades en la seguridad. Se recomienda encarecidamente usar Microsoft Entra ID con las aplicaciones.

Autenticación mediante una clave de acceso

La autenticación de clave es la forma más sencilla de autenticación. Puede pasar la clave de acceso como un encabezado HTTP o un parámetro de consulta de dirección URL.

Clave de acceso en un encabezado HTTP

Pase la clave de acceso como un valor para el encabezado HTTP: aeg-sas-key.

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Clave de acceso como parámetro de consulta

También puede especificar aeg-sas-key como parámetro de consulta.

Por ejemplo, para temas de espacio de nombres, esta es la forma en que la dirección URL de la solicitud HTTP podría parecer pasar una clave como parámetro.

https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>:publish?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

En el caso de temas, dominios y espacios de nombres de asociados personalizados, la dirección URL de la solicitud HTTP debe ser similar a la siguiente:

https://<yourtopic>.<region>.eventgrid.azure.net/api/events?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Firmas de acceso compartido

Las firmas de acceso compartido (SAS) proporcionan control de acceso sobre los recursos con los que los clientes pueden comunicarse. Estos son algunos de los controles que puede establecer en una SAS:

  • Establezca una hora de expiración de SAS. Este valor define eficazmente el intervalo en el que la SAS es válida para la autenticación.
  • Recurso para el que se puede usar una SAS. El token de SAS se puede crear para acceder a temas personalizados, dominios, espacios de nombres de asociados y espacios de nombres. Si crea una SAS para un tema personalizado, un dominio o un espacio de nombres de asociado, un cliente puede usarlo para publicar eventos en cualquiera de esos recursos. Al crear una SAS para los recursos de espacio de nombres, tiene un control pormenorizado sobre el acceso de un cliente. Si crea una SAS cuyo recurso es un espacio de nombres, un cliente puede publicar eventos en cualquier tema de espacio de nombres dentro del espacio de nombres y puede recibir eventos de cualquier suscripción de eventos en cualquiera de los temas del espacio de nombres. Del mismo modo, al crear una SAS para un tema de espacio de nombres, un cliente puede publicar eventos en ese tema de espacio de nombres y recibir eventos de cualquier suscripción de eventos en ese tema. Cuando se crea una SAS para una suscripción de eventos, el cliente puede recibir eventos a través de esa suscripción de eventos.
  • Solo los clientes que presentan una SAS válida pueden enviar o recibir datos a Event Grid.

Token de firma de acceso compartido

Puede generar un token de SAS que se incluirá cuando la aplicación cliente se comunique con Event Grid. Los tokens de SAS para los recursos de Event Grid son Base64 cadenas codificadas con el formato siguiente: r={resource}&e={expiration_utc}&s={signature}.

  • {resource} es la dirección URL que representa el recurso de Event Grid al que accede el cliente.
    • El formato de dirección URL válido para temas, dominios y espacios de nombres de asociados personalizados es https://<yourtopic>.<region>.eventgrid.azure.net/api/events.
    • El formato válido para los recursos de espacio de nombres es el siguiente:
      • Espacios de nombres: https://<namespace-name>.<region>.eventgrid.azure.net
      • Temas de espacio de nombres: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • Suscripciones de eventos: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc} es la hora de expiración UTC codificada en la dirección URL de SAS.
  • {signature} es el hash SHA-256 calculado a través del URI del recurso y la representación de cadena del instante de expiración del token, separados por CRLF. El cálculo del hash es similar al siguiente pseudocódigo y devuelve un valor de hash de 256 bits/32 bytes.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

El token contiene los valores no hash para que el destinatario (Event Grid) pueda volver a calcular el hash con los mismos parámetros, comprobando que el token no se ha modificado (integridad de datos).

Un token de SAS es válido para todos los recursos prefijos con el URI de recurso usado en la cadena de firma.

Para consultar todas las versiones de API admitidas al usar Event Grid, vea tipos de recursos Microsoft.EventGrid.

Autenticación mediante SAS

La aplicación puede autenticarse antes de un recurso de Event Grid mediante la presentación de un token de SAS. Esto se puede hacer mediante el encabezado aeg-sas-token o el encabezado Authorization SharedAccessSignature con una solicitud HTTP. En las secciones siguientes se describe cómo generar un token de SAS y cómo usarlo cuando la aplicación cliente realiza solicitudes HTTP para enviar o recibir eventos (entrega de extracción).

Generar tokens de SAS mediante programación

Los siguientes ejemplos de C# y Python muestran cómo crear un token de SAS para su uso con Event Grid:

Ejemplo de C#

static string BuildSharedAccessSignature(string resource, DateTime expirationUtc, string key)
{
    const char Resource = 'r';
    const char Expiration = 'e';
    const char Signature = 's';

    string encodedResource = HttpUtility.UrlEncode(resource);
    var culture = CultureInfo.CreateSpecificCulture("en-US");
    var encodedExpirationUtc = HttpUtility.UrlEncode(expirationUtc.ToString(culture));

    string unsignedSas = $"{Resource}={encodedResource}&{Expiration}={encodedExpirationUtc}";
    using (var hmac = new HMACSHA256(Convert.FromBase64String(key)))
    {
        string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(unsignedSas)));
        string encodedSignature = HttpUtility.UrlEncode(signature);
        string signedSas = $"{unsignedSas}&{Signature}={encodedSignature}";

        return signedSas;
    }
}

Ejemplo de Python

def generate_sas_token(uri, key, expiry=3600):
    ttl = datetime.datetime.utcnow() + datetime.timedelta(seconds=expiry)
    encoded_resource = urllib.parse.quote_plus(uri)
    encoded_expiration_utc = urllib.parse.quote_plus(ttl.isoformat())

    unsigned_sas = f'r={encoded_resource}&e={encoded_expiration_utc}'
    signature = b64encode(HMAC(b64decode(key), unsigned_sas.encode('utf-8'), sha256).digest())
    encoded_signature = urllib.parse.quote_plus(signature)
    
    token = f'r={encoded_resource}&e={encoded_expiration_utc}&s={encoded_signature}'

    return token

Uso del encabezado de token AEG-SAS

Este es un ejemplo que muestra cómo pasar un token de SAS como un valor para el encabezado de aeg-sas-token.

aeg-sas-token: r=https%3a%2f%2fmytopic.eventgrid.azure.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

Uso del encabezado de autorización

En este ejemplo se muestra cómo pasar un token de SAS como un valor para el encabezado Authorization.

Authorization: SharedAccessSignature r=https%3a%2f%2fmytopic.eventgrid.azure.net%2fapi%2fevents&e=6%2f15%2f2017+6%3a20%3a15+PM&s=XXXXXXXXXXXXX%2fBPjdDLOrc6THPy3tDcGHw1zP4OajQ%3d

Pasos siguientes