Проверка подлинности Сетка событий 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>
- Пространства имен:
- Допустимый формат URL-адреса для пользовательских разделов, доменов
{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