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 Griglia di eventi di Azure argomenti dello spazio dei nomi, argomenti personalizzati, domini e spazi dei nomi dei partner tramite la chiave di accesso o il token di firma di accesso condiviso.
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, un URL della richiesta HTTP che passa una chiave come parametro avrebbe questo aspetto.
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:
- Impostare una scadenza della firma di accesso condiviso. Questo valore definisce in modo efficace l'intervallo in cui la firma di accesso condiviso è valida per l'autenticazione.
- Risorsa per cui è possibile usare una firma di accesso condiviso. È possibile creare un token di firma di accesso condiviso per accedere ad argomenti personalizzati, domini, spazi dei nomi dei partner e spazi dei nomi. Se si crea una firma di accesso condiviso per uno spazio dei nomi personalizzato, un dominio o uno spazio dei nomi dei partner, un client può usarla per pubblicare eventi in una di queste risorse. Quando si crea una firma di accesso condiviso per le risorse dello spazio dei nomi, si ha un controllo granulare su ciò a cui un client può accedere. Se si crea una firma di accesso condiviso la cui risorsa è uno spazio dei nomi, un client può pubblicare eventi in qualsiasi argomento dello spazio dei nomi all'interno dello spazio dei nomi e può ricevere eventi da qualsiasi sottoscrizione di eventi in qualsiasi argomento dello spazio dei nomi. Analogamente, quando si crea una firma di accesso condiviso 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 viene creata una firma di accesso condiviso per una sottoscrizione di eventi, il client può ricevere eventi tramite la sottoscrizione.
- Solo i client che presentano una firma di accesso condiviso valida possono inviare o ricevere dati da Griglia di eventi.
Token di firma di accesso condiviso
È possibile generare un token di firma di accesso condiviso da includere quando l'applicazione client comunica con Griglia di eventi. I token di firma di accesso condiviso per le risorse di Griglia di eventi 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:
- Spazi dei nomi:
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>
- Spazi dei nomi:
- Il formato URL valido per argomenti personalizzati, domini e spazi dei nomi dei partner è
{expiration_utc}
è la scadenza in formato UTC codificata nell'URL della 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 di firma di accesso condiviso è valido per tutte le risorse il cui prefisso è l'URI della risorsa usato nella stringa della firma.
Per visualizzare tutte le versioni dell'API supportate quando si utilizza Griglia di eventi, vedere Tipi di risorsa di Microsoft.EventGrid.
Autenticazione tramite firma di accesso condiviso
L'applicazione può eseguire l'autenticazione prima di una risorsa di Griglia di eventi presentando un token di firma di accesso condiviso. 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 di firma di accesso condiviso e come usarlo quando l'applicazione client effettua richieste HTTP per inviare o ricevere eventi (recapito pull).
Generare token di firma di accesso condiviso a livello di codice
Gli esempi di C# e Python seguenti illustrano come creare un token di firma di accesso condiviso da usare con Griglia di eventi:
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 di firma di accesso condiviso 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 token di firma di accesso condiviso 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