Uwierzytelnianie klientów usługi Azure Event Grid przy użyciu kluczy dostępu lub sygnatur dostępu współdzielonego
Ten artykuł zawiera informacje dotyczące uwierzytelniania klientów w tematach przestrzeni nazw usługi Azure Event Grid, tematach niestandardowych, domenach i przestrzeniach nazw partnerów przy użyciu klucza dostępu lub tokenu sygnatury dostępu współdzielonego (SAS).
Ważne
- Uwierzytelnianie i autoryzowanie użytkowników lub aplikacji przy użyciu tożsamości firmy Microsoft Entra zapewnia doskonałe zabezpieczenia i łatwość korzystania z uwierzytelniania opartego na kluczach i sygnatur dostępu współdzielonego (SAS). W przypadku identyfikatora Entra firmy Microsoft nie ma potrzeby przechowywania wpisów tajnych używanych do uwierzytelniania w kodzie i ryzyka potencjalnych luk w zabezpieczeniach. Zdecydowanie zalecamy używanie identyfikatora Entra firmy Microsoft z aplikacjami.
Uwierzytelnianie przy użyciu klucza dostępu
Uwierzytelnianie za pomocą klucza dostępu jest najprostszą formą uwierzytelniania. Klucz dostępu można przekazać jako nagłówek HTTP lub parametr zapytania adresu URL.
Klucz dostępu w nagłówku HTTP
Przekaż klucz dostępu jako wartość nagłówka HTTP: aeg-sas-key
.
aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==
Klucz dostępu jako parametr zapytania
Można również określić aeg-sas-key
jako parametr zapytania.
Na przykład w przypadku tematów przestrzeni nazw jest to sposób, w jaki adres URL żądania HTTP może wyglądać, przekazując klucz jako parametr.
https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>:publish?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==
W przypadku niestandardowych tematów, domen i przestrzeni nazw partnerów adres URL żądania HTTP powinien wyglądać następująco:
https://<yourtopic>.<region>.eventgrid.azure.net/api/events?aeg-sas-key=XXXXXXXX53249XX8XXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==
Sygnatury dostępu współdzielonego
Sygnatury dostępu współdzielonego (SAS) zapewniają kontrolę dostępu nad zasobami, za pomocą których klienci mogą komunikować się. Oto niektóre kontrolki, które można ustawić w sygnaturze dostępu współdzielonego:
- Ustaw czas wygaśnięcia sygnatury dostępu współdzielonego. Ta wartość skutecznie definiuje interwał, przez który sygnatura dostępu współdzielonego jest prawidłowa, może służyć do uwierzytelniania.
- Zasób, dla którego można użyć sygnatury dostępu współdzielonego. Token sygnatury dostępu współdzielonego można utworzyć w celu uzyskania dostępu do tematów niestandardowych, domen, przestrzeni nazw partnerów i przestrzeni nazw. Jeśli tworzysz sygnaturę dostępu współdzielonego dla niestandardowego tematu, domeny lub przestrzeni nazw partnera, klient może użyć go do publikowania zdarzeń do dowolnego z tych zasobów. Podczas tworzenia sygnatury dostępu współdzielonego dla zasobów przestrzeni nazw masz szczegółową kontrolę nad tym, do czego klient może uzyskać dostęp. Jeśli tworzysz sygnaturę dostępu współdzielonego, której zasób jest przestrzenią nazw, klient może publikować zdarzenia w dowolnym temacie przestrzeni nazw w przestrzeni nazw i odbierać zdarzenia z dowolnej subskrypcji zdarzeń w dowolnym temacie przestrzeni nazw. Podobnie podczas tworzenia sygnatury dostępu współdzielonego dla tematu przestrzeni nazw klient może publikować zdarzenia w tym temacie przestrzeni nazw i odbierać zdarzenia z dowolnej subskrypcji zdarzeń w tym temacie. Po utworzeniu sygnatury dostępu współdzielonego dla subskrypcji zdarzeń klient może odbierać zdarzenia za pośrednictwem tej subskrypcji zdarzeń.
- Tylko klienci, którzy prezentują prawidłową sygnaturę dostępu współdzielonego, mogą wysyłać lub odbierać dane do usługi Event Grid.
Token sygnatury dostępu współdzielonego
Token SYGNATURy dostępu współdzielonego można wygenerować, gdy aplikacja kliencka komunikuje się z usługą Event Grid. Tokeny sygnatury dostępu współdzielonego dla zasobów usługi Event Grid są URL
kodowane ciągami o następującym formacie: r={resource}&e={expiration_utc}&s={signature}
.
{resource}
to adres URL reprezentujący zasób usługi Event Grid, do którego uzyskuje dostęp klient.- Prawidłowy format adresu URL dla niestandardowych tematów, domen i przestrzeni nazw partnerów to
https://<yourtopic>.<region>.eventgrid.azure.net/api/events
. - Prawidłowy format zasobów przestrzeni nazw jest następujący:
- Przestrzenie nazw:
https://<namespace-name>.<region>.eventgrid.azure.net
- Tematy dotyczące przestrzeni nazw:
https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
- Subskrypcje zdarzeń:
https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
- Przestrzenie nazw:
- Prawidłowy format adresu URL dla niestandardowych tematów, domen i przestrzeni nazw partnerów to
{expiration_utc}
to adres URL sygnatury dostępu współdzielonego zakodowany czas wygaśnięcia UTC.{signature}
jest skrótem SHA-256 obliczonym za pośrednictwem identyfikatora URI zasobu i reprezentacją ciągu natychmiastowego wygaśnięcia tokenu oddzielonego znakiem CRLF. Obliczenie skrótu wygląda podobnie do poniższego pseudo kodu i zwraca wartość skrótu 256-bitowego/32-bajtowego.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)
Token zawiera wartości inne niż skróty, aby odbiorca (Event Grid) mógł ponownie skompilować skrót z tymi samymi parametrami, sprawdzając, czy token nie został zmodyfikowany (integralność danych).
Token sygnatury dostępu współdzielonego jest prawidłowy dla wszystkich zasobów poprzedzonych identyfikatorem URI zasobu używanym w ciągu podpisu.
Aby zapoznać się ze wszystkimi obsługiwanymi wersjami interfejsu API podczas korzystania z usługi Event Grid, zobacz Typy zasobów Microsoft.EventGrid.
Uwierzytelnianie przy użyciu sygnatury dostępu współdzielonego
Aplikacja może uwierzytelniać się przed zasobem usługi Event Grid, prezentując token SAS. Można to zrobić przy użyciu nagłówka aeg-sas-token
lub nagłówka Authorization SharedAccessSignature
z żądaniem HTTP. W poniższych sekcjach opisano sposób generowania tokenu SYGNATURy dostępu współdzielonego i sposobu używania go, gdy aplikacja kliencka wysyła żądania HTTP do wysyłania lub odbierania (dostarczania ściągnięcia).
Programowe generowanie tokenu SAS
W poniższych przykładach języków C# i Python pokazano, jak utworzyć token SAS do użycia z usługą Event Grid:
Przykład w języku 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;
}
}
Przykład języka 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
Używanie nagłówka aeg-sas-token
Oto przykład pokazujący, jak przekazać token SAS jako wartość nagłówka 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
Używanie nagłówka autoryzacji
W tym przykładzie pokazano, jak przekazać token SAS jako wartość nagłówka 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