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

В этой статье содержатся сведения о проверке подлинности клиентов для Сетка событий Azure разделов пространства имен, пользовательских тем, доменов и пространств имен партнеров с помощью ключа доступа или маркера SAS.

Внимание

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

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

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

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

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

aeg-sas-key: XXXXXXXXXXXXXXXXXX0GXXX/nDT4hgdEj9DpBeRr38arnnm5OFg==

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

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

Например, в разделах пространства имен это способ, по который URL-адрес HTTP-запроса может выглядеть как параметр.

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

Для пользовательских разделов, доменов и пространств имен партнеров URL-адрес HTTP-запроса должен выглядеть следующим образом:

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

Подписанные URL-адреса

Подписанные URL-адреса (SAS) обеспечивают управление доступом к ресурсам, с которыми клиенты могут взаимодействовать. Вот некоторые элементы управления, которые можно настроить в SAS.

  • Задайте время истечения срока действия SAS. Это значение эффективно определяет интервал, через который можно использовать SAS для проверки подлинности.
  • Ресурс, для которого можно использовать SAS. Маркер SAS можно создать для доступа к пользовательским темам, доменам, пространствам имен партнера и пространствам имен. При создании SAS для пользовательского раздела, домена или пространства имен партнера клиент может использовать его для публикации событий в любом из этих ресурсов. При создании SAS для ресурсов пространства имен у вас есть детальный контроль над доступом клиента. Если вы создаете SAS, ресурс которого является пространством имен, клиент может публиковать события в любом разделе пространства имен внутри пространства имен и получать события из любой подписки на события в любой из тем пространства имен. Аналогичным образом при создании SAS для раздела пространства имен клиент может публиковать события в этом разделе пространства имен и получать события из любой подписки на события в этом разделе. При создании SAS для подписки на события клиент может получать события через подписку на это событие.
  • Только клиенты, которые представляют допустимый SAS, могут отправлять или получать данные в сетку событий.

Маркер подписанного URL-адреса

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

  • {resource} — это URL-адрес, представляющий ресурс сетки событий, к которому обращается клиент.
    • Допустимый формат URL-адреса для пользовательских разделов, доменов https://<yourtopic>.<region>.eventgrid.azure.net/api/eventsи пространств имен партнеров.
    • Допустимый формат ресурсов пространства имен выглядит следующим образом:
      • Пространства имен: https://<namespace-name>.<region>.eventgrid.azure.net
      • Разделы пространства имен: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>
      • Подписки на события: https://<namespace_name>.<region>.eventgrid.azure.net/topics/<topic_name>/eventsubscriptions/<event_subscription_name>
  • {expiration_utc} — url-адрес SAS, закодированный в формате UTC.
  • {signature} — это хэш SHA-256, вычисляемый по URI ресурса и строковое представление истечения срока действия маркера, разделенное CRLF. Вычисление хэша напоминает следующий псевдокод и возвращает 256-битное (32-байтное) значение хэша.
SHA-256('https://<namespace_name>.eventgrid.azure.net/'+'\n'+ 1438205742)

Маркер содержит не хэшированные значения, чтобы получатель (сетка событий) перекомпилировал хэш с теми же параметрами, проверяя, что маркер не был изменен (целостность данных).

Маркер SAS действителен для всех ресурсов, префиксированных с помощью URI ресурса, используемого в строке подписи.

Чтобы ознакомиться со всеми поддерживаемыми версиями API при использовании сетки событий, см . сведения о типах ресурсов Microsoft.EventGrid.

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

Приложение может пройти проверку подлинности перед ресурсом Сетки событий, предоставив маркер SAS. Это можно сделать с помощью заголовка aeg-sas-token или Authorization SharedAccessSignature заголовка с HTTP-запросом. В следующих разделах описывается способ создания маркера SAS и его использования, когда клиентское приложение выполняет HTTP-запросы для отправки или получения (доставки по запросу).

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

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

Пример 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;
    }
}

Пример 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

С использованием заголовка 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

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