Аутентификация клиентов Azure Event Grid с помощью ключей доступа или общих токенов доступа

В этой статье предлагаем информацию об аутентификации клиентов для тем, настраиваемых тем, доменов и партнерских пространств имен Azure Event Grid, используя ключ доступа или маркера Shared Access Signature (SAS).

Внимание

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

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

Аутентификация с использованием ключа доступа — самая простая форма аутентификации. Ключ доступа можно передать в качестве заголовка 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==

Подписанные разрешения на доступ

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

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

Токен общего доступа (Shared Access Signature)

Вы можете создать маркер SAS для включения, когда ваше клиентское приложение взаимодействует с Event Grid. Маркеры 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 при использовании Event Grid, см. сведения о типах ресурсов Microsoft.EventGrid.

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

Приложение может аутентифицироваться перед ресурсом Event Grid, предоставив токен 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

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