Condividi tramite


Autenticare i client di Griglia di eventi di Azure usando chiavi di accesso o firme di accesso condiviso

Questo articolo fornisce informazioni sull'autenticazione dei client per gli argomenti dello spazio dei nomi di Griglia di Eventi di Azure, argomenti personalizzati, domini e spazi dei nomi partner tramite la chiave di accesso o il token di Firma di Accesso Condiviso (SAS).

Importante

  • L'autenticazione e l'autorizzazione di utenti o applicazioni tramite le identità di Microsoft Entra offre una maggiore sicurezza e facilità d'uso rispetto all'autenticazione basata su chiavi e firme di accesso condiviso (SAS). Con Microsoft Entra ID non è necessario archiviare i segreti usati per l'autenticazione nel codice e rischiare potenziali vulnerabilità di sicurezza. È consigliabile usare Microsoft Entra ID con le applicazioni.

Autenticazione tramite chiave di accesso

L'autenticazione tramite chiave di accesso è la forma più semplice di autenticazione. È possibile passare la chiave di accesso come intestazione HTTP o come parametro di query URL.

Chiave di accesso in un'intestazione HTTP

Passare la chiave di accesso come valore per l'intestazione HTTP: aeg-sas-key.

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Chiave di accesso come parametro di query

Come parametro di query è anche possibile specificare aeg-sas-key.

Ad esempio, per un argomento nello spazio dei nomi, l'URL della richiesta HTTP potrebbe apparire così quando si passa una chiave come parametro.

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

Per argomenti personalizzati, domini e spazi dei nomi partner, l'URL della richiesta HTTP dovrebbe essere simile al seguente:

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

Firme di accesso condiviso

Le firme di accesso condiviso (SAS) offrono il controllo di accesso sulle risorse con cui i client possono comunicare. Ecco alcuni dei controlli che è possibile impostare in una firma di accesso condiviso (SAS):

  • Impostare un tempo di scadenza per la firma di accesso condiviso (SAS). Questo valore definisce in modo efficace l'intervallo in cui la firma di accesso condiviso è valida e può essere utilizzata per l'autenticazione.
  • Risorsa per cui è possibile usare un SAS. È possibile creare un token di firma di accesso condiviso (SAS) per accedere ad argomenti personalizzati, domini, spazi dei nomi e spazi dei nomi dei partner. Se si crea un SAS (Shared Access Signature) per un argomento personalizzato, un dominio o uno spazio dei nomi partner, un client può utilizzarlo per pubblicare eventi su una di queste risorse. Quando si crea una SAS (firma di accesso condiviso) per le risorse del namespace, si ha un controllo granulare su ciò a cui un client può accedere. Se si crea una firma di accesso condiviso (SAS) la cui risorsa è uno spazio dei nomi, un client può pubblicare eventi in uno qualsiasi dei suoi argomenti e può ricevere eventi da qualsiasi sottoscrizione di eventi su qualsiasi argomento dello spazio dei nomi. Analogamente, quando si crea un SAS per un argomento dello spazio dei nomi, un client può pubblicare eventi in tale argomento dello spazio dei nomi e ricevere eventi da qualsiasi sottoscrizione di eventi nell'argomento. Quando si crea una firma di accesso condiviso (SAS) per una sottoscrizione di eventi, il client può ricevere eventi tramite quella sottoscrizione.
  • Solo i client che presentano una valida SAS (firma di accesso condiviso) possono inviare o ricevere dati da e verso Event Grid.

Token di firma di accesso condiviso

È possibile generare un token di firma di accesso condiviso da includere quando l'applicazione client comunica con Event Grid. I token SAS per le risorse di Event Grid sono stringhe con codifica URL nel formato seguente: r={resource}&e={expiration_utc}&s={signature}.

  • {resource} è l'URL che rappresenta la risorsa di Griglia di eventi a cui il client accede.
    • Il formato URL valido per argomenti personalizzati, domini e spazi dei nomi dei partner è https://<yourtopic>.<region>.eventgrid.azure.net/api/events.
    • Il formato valido per le risorse dello spazio dei nomi è il seguente:
      • Namespace: https://<namespace-name>.<region>.eventgrid.azure.net
      • Argomenti dello spazio dei nomi: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • Sottoscrizioni di eventi: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc} è l'ora di scadenza UTC codificata nell'URL del SAS (firma di accesso condiviso).
  • {signature} è il codice hash SHA-256 calcolato in base all'URI della risorsa e la rappresentazione in forma di stringa dell'istante di scadenza del token, separati da CRLF. Il calcolo del codice hash è simile allo pseudo codice seguente e restituisce un valore hash a 256 bit o 32 byte.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

Il token contiene i valori non hash in modo che il destinatario (Griglia di eventi) possa ricalcolare il codice hash con gli stessi parametri, verificando che il token non sia stato modificato (integrità dei dati).

Un token SAS è valido per tutte le risorse che hanno un URI della risorsa con il prefisso usato nella stringa di firma.

Per visualizzare tutte le versioni dell'API supportate quando si utilizza Griglia di eventi, vedere Tipi di risorsa di Microsoft.EventGrid.

Autenticazione tramite SAS

L'applicazione può eseguire l'autenticazione prima di una risorsa di Event Grid presentando un token SAS. Questa operazione può essere eseguita usando l'intestazione aeg-sas-token o l'intestazione Authorization SharedAccessSignature con una richiesta HTTP. Le sezioni seguenti descrivono come generare un token SAS e come usarlo quando l'applicazione client effettua richieste HTTP per inviare o ricevere eventi (recapito pull).

Generare token di firma di accesso condiviso programmaticamente

Gli esempi di C# e Python seguenti mostrano come creare un token SAS da usare con Event Grid.

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

Esempio in 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 dell'intestazione aeg-sas-token

Ecco un esempio che illustra come passare un token SAS come valore per l'intestazione 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 dell'intestazione Authorization

Questo esempio illustra come passare un SAS token come valore per l'intestazione 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

Passaggi successivi