Authentifizieren von Azure Event Grid-Clients mithilfe von Zugriffsschlüsseln oder SAS (Shared Access Signatures)

Dieser Artikel enthält Informationen zur Authentifizierung von Clients für Azure Event Grid-Namespacethemen, benutzerdefinierte Themen, Domänen und Partnernamespaces mit Zugriffsschlüssel oder SAS-Token (Shared Access Signature).

Wichtig

  • Die Authentifizierung und Autorisierung von Benutzern oder Anwendungen mithilfe von Microsoft Entra-Identitäten bietet höhere Sicherheit und Benutzerfreundlichkeit als schlüsselbasierte SAS-Authentifizierung (Shared Access Signatures). Mit Microsoft Entra ID ist es nicht erforderlich, für Authentifizierung verwendete Geheimnisse in Ihrem Code zu speichern und potenzielle Sicherheitsrisiken einzugehen. Es wird dringend empfohlen, Microsoft Entra-ID mit Ihren Anwendungen zu verwenden.

Authentifizieren mithilfe eines Zugriffsschlüssels

Schlüsselauthentifizierung ist die einfachste Form von Authentifizierung. Sie können den Zugriffsschlüssel als HTTP-Header oder URL-Abfrageparameter übergeben.

Zugriffsschlüssel in einem HTTP-Header

Übergeben Sie den Zugriffsschlüssel als Wert für den HTTP-Header: aeg-sas-key.

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Zugriffsschlüssel als Abfrageparameter

Sie können auch aeg-sas-key als Abfrageparameter angeben.

Für Namespacethemen ist dies beispielsweise die Art und Weise, wie Ihre HTTP-Anforderungs-URL einen Schlüssel als Parameter übergibt.

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

Bei benutzerdefinierten Themen, Domänen und Partnernamespaces sollte Ihre HTTP-Anforderungs-URL wie folgt aussehen:

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

Shared Access Signatures

Shared Access Signatures (SAS) bietet Ihnen die Zugriffssteuerung über Ressourcen, mit denen Clients kommunizieren können. Folgende Kontrollen können Sie beispielsweise in einer SAS festlegen:

  • Legen Sie eine SAS-Ablaufzeit fest. Dieser Wert definiert effektiv das Intervall, über das die SAS gültig ist, für die Authentifizierung verwendet werden kann.
  • Die Ressource, für die ein SAS verwendet werden kann. SAS-Token kann erstellt werden, um auf benutzerdefinierte Themen, Domänen, Partnernamespaces und Namespaces zuzugreifen. Wenn Sie ein SAS für ein benutzerdefiniertes Thema, eine Domäne oder einen Partnernamespace erstellen, kann ein Client es verwenden, um Ereignisse in einer dieser Ressourcen zu veröffentlichen. Wenn Sie ein SAS für Namespaceressourcen erstellen, haben Sie präzise Kontrolle darüber, auf was ein Client zugreifen kann. Wenn Sie eine SAS erstellen, deren Ressource ein Namespace ist, kann ein Client Ereignisse in einem beliebigen Namespacethema innerhalb des Namespace veröffentlichen und Ereignisse von jedem Ereignisabonnement in einem der Themen des Namespace empfangen. Ebenso kann ein Client, wenn Sie ein SAS für ein Namespacethema erstellen, Ereignisse in diesem Namespacethema veröffentlichen und Ereignisse aus jedem Ereignisabonnement in diesem Thema empfangen. Wenn ein SAS für ein Ereignisabonnement erstellt wird, kann der Client Ereignisse über dieses Ereignisabonnement empfangen.
  • Nur Clients, die eine gültige SAS präsentieren, können Daten an das Event Grid senden oder empfangen.

SAS Token

Sie können ein SAS-Token generieren, das einbezogen werden soll, wenn Ihre Clientanwendung mit dem Ereignisraster kommuniziert. SAS-Token für Event Grid-Ressourcen sind URL codierte Zeichenfolgen mit dem folgenden Format: r={resource}&e={expiration_utc}&s={signature}.

  • {resource} ist die URL, die die Ereignisrasterressource darstellt, auf die der Client zugreift.
    • Das gültige URL-Format für benutzerdefinierte Themen, Domänen und Partnernamespaces lautet https://<yourtopic>.<region>.eventgrid.azure.net/api/events.
    • Das gültige Format für Namespaceressourcen lautet wie folgt:
      • Namespaces: https://<namespace-name>.<region>.eventgrid.azure.net
      • Namespacethemen: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • Ereignisabonnements: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc} ist die URL der SAS-codierten UTC-Ablaufzeit.
  • {signature} ist der SHA-256-Hash, der über den Ressourcen-URI berechnet wird, und eine Zeichenfolgendarstellung des Tokenablaufwerts, getrennt durch CRLF. Die Berechnung des Hashs ähnelt dem folgenden Pseudocode und gibt einen 256-Bit-/32-Byte-Hashwert zurück.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

Das Token enthält die Nicht-Hashwerte, sodass der Empfänger (Ereignisraster) den Hash mit denselben Parametern neu kompensieren kann, wobei sichergestellt wird, dass das Token nicht geändert wurde (Datenintegrität).

Ein SAS-Token ist für alle Ressourcen mit dem Präfix Ressourcen URI in der Signaturzeichenfolge gültig.

Informationen zu allen unterstützten API-Versionen bei Verwendung von Event Grid finden Sie unter Microsoft.EventGrid Ressourcentypen.

Authentifizieren mithilfe von SAS

Ihre Anwendung kann sich vor einer Ereignisrasterressource authentifizieren, indem sie ein SAS-Token darstellt. Dies kann mithilfe des aeg-sas-token Headers oder des Authorization SharedAccessSignature Headers mit einer HTTP-Anforderung erfolgen. In den folgenden Abschnitten wird beschrieben, wie sie ein SAS-Token generieren und wie sie verwendet werden, wenn Ihre Clientanwendung HTTP-Anforderungen zum Senden oder Empfangen von Ereignissen (Pull-Übermittlung) sendet.

Programmgesteuertes Generieren von SAS-Token

In den folgenden C#- und Python-Beispielen wird gezeigt, wie Sie ein SAS-Token für die Verwendung mit Event Grid erstellen:

C#-Beispiel

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

Beispiel für 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

Verwenden des aeg-sas-token-Headers

Hier ist ein Beispiel, das zeigt, wie ein SAS-Token als Wert für den aeg-sas-token Header übergeben wird.

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

Verwenden des Autorisierungsheaders

In diesem Beispiel wird gezeigt, wie ein SAS-Token als Wert für den Authorization Header übergeben wird.

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

Nächste Schritte