Partager via


Authentifier les clients Azure Event Grid avec des clés d’accès ou des signatures d’accès partagé

Cet article fournit des informations sur l’authentification des clients auprès des rubriques d’espace de noms Azure Event Grid, des rubriques personnalisées, des domaines et des espaces de noms de partenaires en utilisant une clé d’accès ou un jeton de signature d’accès partagé (SAS).

Important

  • L’authentification et l’autorisation des utilisateurs ou des applications en utilisant des identités Microsoft Entra offrent davantage de sécurité et de facilité d’utilisation par rapport à l’authentification basée sur une clé et avec des signatures d’accès partagé (SAS). Microsoft Entra ID vous évite de stocker les secrets utilisés pour l’authentification dans votre code et de risquer d’éventuelles vulnérabilités de sécurité. Nous vous recommandons vivement d’utiliser Microsoft Entra ID avec vos applications.

S’authentifier à l’aide d’une clé d’accès

L’authentification par clé d’accès est la plus simple. Vous pouvez passer la clé d’accès sous la forme d’un en-tête HTTP ou d’un paramètre de requête d’URL.

Clé d’accès dans un en-tête HTTP

Transmettez la clé d’accès en tant que valeur pour l’en-tête HTTP : aeg-sas-key.

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Clé d’accès en tant que paramètre de requête

Vous pouvez également spécifier aeg-sas-key en tant que paramètre de requête.

Par exemple, pour les rubriques d’espace de noms, il s’agit de la façon dont l’URL de votre requête HTTP pourrait se présenter en transmettant une clé en tant que paramètre.

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

Pour les rubriques personnalisées, les domaines et les espaces de noms de partenaires, l’URL de votre requête HTTP doit se présenter comme suit :

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

Signatures d’accès partagé

Les signatures d’accès partagé (SAP) vous permettent de contrôler l’accès aux ressources avec lesquelles les clients peuvent communiquer. Voici quelques-uns des contrôles que vous pouvez définir dans une signature d’accès partagé :

  • Définissez un délai d’expiration de SAP. Cette valeur définit efficacement l’intervalle durant lequel la SAP est valide et peut être utilisée pour l’authentification.
  • Ressource pour laquelle une SAP peut être utilisée. Un jeton de SAP peut être créé pour accéder à des rubriques personnalisées, des domaines, des espaces de noms de partenaires et des espaces de noms. Si vous créez une SAP pour une rubrique personnalisée, un domaine ou un espace de noms de partenaire, un client peut l’utiliser pour publier des événements dans l’une de ces ressources. Lorsque vous créez une SAP pour des ressources d’espace de noms, vous pouvez contrôle de façon précise ce à quoi un client peut accéder. Si vous créez une SAP dont la ressource est un espace de noms, un client peut publier des événements dans n’importe quelle rubrique d’espace de noms à l’intérieur de l’espace de noms et recevoir les événements d’un abonnement à des événements dans n’importe quelle rubrique de l’espace de noms. De la même façon, lorsque vous créez une SAP pour une rubrique d’espace de noms, un client peut publier des événements dans cette rubrique d’espace de noms et recevoir les événements d’un abonnement à des événements dans cette rubrique. Lorsqu’une SAP est créée pour un abonnement à des événements, le client peut recevoir les événements par l’intermédiaire de cet abonnement.
  • Seuls les clients qui présentent une SAP valide peuvent envoyer des données à Event Grid ou en recevoir.

Jeton de signature d’accès partagé

Vous pouvez générer un jeton de SAP à inclure lorsque votre application cliente communique avec Event Grid. Les jetons de SAP pour ressources Event Grid sont des chaînes encodées en URL au format suivant : r={resource}&e={expiration_utc}&s={signature}.

  • {resource} est l’URL qui représente la ressource Event Grid à laquelle le client accède.
    • Le format d’URL valide pour les rubriques personnalisées, les domaines et les espaces de noms de partenaires est https://<yourtopic>.<region>.eventgrid.azure.net/api/events.
    • Le format valide pour les ressources d’espace de noms est le suivant :
      • Espaces de noms : https://<namespace-name>.<region>.eventgrid.azure.net
      • Rubriques d’espace de noms : https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • Abonnements à des événements : https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc} correspond à l’heure d’expiration UTC encodée en URL de la SAP.
  • {signature} est le hachage SHA-256 calculé à partir de l’URI de la ressource et la représentation sous forme de chaîne du moment où expire le jeton, séparés par CRLF. Le calcul de hachage est similaire au code de pseudo suivant et retourne une valeur de hachage de 256 bits/32 octets.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

Le jeton contient les valeurs non hachées de sorte que le destinataire (Event Grid) puisse recalculer le hachage avec les mêmes paramètres, en vérifiant que le jeton n’a pas été modifié (intégrité des données).

Un jeton de SAP est valide pour toutes les ressources ayant pour préfixe l’URI de ressource utilisé dans la chaîne de signature.

Pour voir toutes les versions d’API prises en charge, consultez Types de ressources Microsoft.EventGrid.

S’authentifier à l’aide d’une signature SAS

Votre application peut s’authentifier auprès d’une ressource Event Grid en présentant un jeton de SAP. Cela est possible en utilisant l’en-tête aeg-sas-token ou l’en-tête Authorization SharedAccessSignature avec une requête HTTP. Les sections suivantes décrivent la méthode pour générer un jeton de SAP et expliquent comment l’utiliser lorsque votre application cliente effectue des requêtes HTTP pour envoyer ou recevoir des événements (remise par extraction).

Générer des jetons SAS par programmation

Les exemples C# et Python suivants vous montrent comment créer un jeton de SAP à utiliser avec Event Grid :

Exemple 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;
    }
}

Exemple 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

Utilisation de l’en-tête eg-sas-token

Voici un exemple qui montre comment transmettre un jeton de SAP en tant que valeur pour l’en-tête 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

Utilisation de l’en-tête Authorization

Cet exemple montre comment transmettre un jeton de SAP en tant que valeur pour l’en-tête 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

Étapes suivantes