Проверка подлинности клиентов публикации службы "Сетка событий Azure" с помощью ключей доступа или подписанных URL-адресов

Эта статья содержит сведения об аутентификации клиентов, публикующих события в разделах, доменах или партнерских пространствах имен службы "Сетка событий Azure" с помощью ключа доступа или маркера подписанного URL-адреса (SAS).

Важно!

  • Проверка подлинности и авторизация пользователей или приложений с помощью удостоверений Microsoft Entra обеспечивает более высокую безопасность и удобство использования при проверке подлинности на основе ключей и подписанных URL-адресов (SAS). При использовании идентификатора Microsoft Entra не требуется хранить секреты, используемые для проверки подлинности в коде и потенциальных уязвимостях безопасности. Настоятельно рекомендуется использовать идентификатор Microsoft Entra с приложениями публикации событий Сетка событий Azure. Дополнительные сведения см. в разделе "Проверка подлинности клиентов публикации с помощью идентификатора Microsoft Entra".
  • Проверка подлинности Microsoft Entra не поддерживается для разделов пространства имен.

Аутентификация с использованием ключа доступа

Аутентификация с использованием ключа доступа — самая простая форма аутентификации. Ключ доступа можно передать в качестве заголовка HTTP или параметра запроса URL-адреса.

Ключ доступа в заголовке HTTP

Передайте ключ доступа в качестве значения для заголовка HTTP: aeg-sas-key.

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

Ключ доступа в качестве параметра запроса

Можно также указать aeg-sas-key в качестве параметра запроса.

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

Инструкции по получению ключей доступа для раздела или домена см. в статье Получение ключей доступа.

Проверка подлинности с помощью подписанного URL-адреса

Маркеры SAS для ресурса Сетки событий включают ресурс, время окончания срока его действия и подпись. Маркер SAS имеет следующий формат: r={resource}&e={expiration}&s={signature}.

Ресурс — это путь к разделу "Сетка событий", в который вы отправляете события. Вот пример допустимого пути к ресурсу: https://<yourtopic>.<region>.eventgrid.azure.net/api/events. Сведения о поддерживаемых версиях API см. в статье Типы ресурсов Microsoft.EventGrid.

Сначала программно создайте маркер SAS, а затем используйте заголовок aeg-sas-token или заголовок Authorization SharedAccessSignature для аутентификации с помощью Сетки событий.

Программное создание маркера SAS

В следующем примере создается маркер SAS для использования с сеткой событий:

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

С использованием заголовка aeg-sas-token

Ниже приведен пример передачи маркера SAS в качестве значения для заголовка 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

С использованием заголовка авторизации

Ниже приведен пример передачи маркера SAS в качестве значения для заголовка 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

Следующие шаги

Сведения об аутентификации с помощью обработчиков событий для доставки событий см. в статье Аутентификация доставки событий.