Маркеры ресурсов в Azure Cosmos DB
Область применения: Nosql Mongodb Кассандра Гремлин Таблица
Маркеры ресурсов — это учетные данные, которые могут предоставлять конкретный доступ к контейнерам, разделам или элементам. Их можно настроить, чтобы предоставить определенные разрешения на основе каждого пользователя и работать непосредственно с REST API для Azure Cosmos DB. Маркеры ресурсов предоставляют альтернативу проверке подлинности с помощью первичных или вторичных ключей, настроенных для доступа только для чтения и записи или чтения.
Внимание
Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Поток проверки подлинности, описанный в этой процедуре, требует очень высокого уровня доверия к приложению и несет риски, которые отсутствуют в других потоках. Этот поток следует использовать только в том случае, если другие более безопасные потоки, такие как управляемые удостоверения, не являются жизнеспособными.
Для Azure Cosmos DB проверка подлинности Microsoft Entra является самым безопасным механизмом проверки подлинности. Ознакомьтесь с соответствующим руководством по безопасности для API:
Собственные клиентские библиотеки Azure Cosmos DB обрабатывают создание и управление маркерами ресурсов напрямую. Однако при использовании REST необходимо самостоятельно создать заголовки запросов и проверки подлинности. Дополнительные сведения о создании заголовков проверки подлинности для REST см. в разделе "Управление доступом" в ресурсах Azure Cosmos DB в REST.
Необходимые компоненты
- Существующая учетная запись Azure Cosmos DB
- Пакет SDK для .NET 8 (или более поздней версии)
Создание пользователя и разрешения
Сначала необходимо создать пользователя с помощью пакета SDK Azure Cosmos DB для NoSQL. Затем можно создать разрешение для пользователя.
Примечание.
Многие API, такие как Cassandra и Gremlin, не предоставляют интерфейс с помощью собственных пакетов SDK для создания маркеров ресурсов. Чтобы использовать маркеры ресурсов, необходимо использовать пакеты SDK NoSQL для взаимодействия с конечной точкой учетной записи независимо от выбранного API.
Получите конечную точку NoSQL и один из ключей чтения и записи учетной записи из существующей учетной записи.
Добавьте версию
Microsoft.Azure.Cosmos
пакета 3.x в проект .NET.dotnet add package Microsoft.Azure.Cosmos --version 3.*
Добавьте блок using для
Microsoft.Azure.Cosmos
пространства имен.using Microsoft.Azure.Cosmos;
Создайте новый клиент, указывающий конечную точку учетной записи NoSQL и ключ записи для чтения.
CosmosClient client = new( accountEndpoint: "<account-nosql-endpoint>", authKeyOrResourceToken: "<account-read-write-key>" );
Примечание.
Для учетной записи необходимо использовать конечную точку NoSQL, которая обычно находится в следующем формате:
https://<account-name>.documents.azure.com:443/
Получение объектов базы данных и контейнеров.
Database database = client.GetDatabase("<database-name>"); Container container = database.GetContainer("<container-name>");
Создайте нового пользователя в базе данных, указав имя пользователя.
User user = await database.CreateUserAsync("demo-user");
Создайте новое разрешение для пользователя, указывающего режим разрешений (
Read
илиAll
), уникальный идентификатор, контейнер с областью действия и необязательную область ключа секции.PermissionProperties permissionProperties = new( id: "read-permission", permissionMode: PermissionMode.All, container: container, resourcePartitionKey: new PartitionKey("partition-key-value") ); Permission permission = await user.CreatePermissionAsync(permissionProperties);
Получение маркера ресурса
Теперь снова используйте пакет SDK NoSQL для получения маркера ресурса из учетной записи.
PermissionResponse response = await permission.ReadAsync();
string resourceToken = response.Resource.Token;
Использование маркера ресурса
Наконец, вы можете использовать собственный пакет SDK для API для использования маркера ресурса.
using Microsoft.Azure.Cosmos;
CosmosClient client = new(
accountEndpoint: "<account-nosql-endpoint>",
authKeyOrResourceToken: "<resource-token>"
);
Container container = client.GetContainer("<database-name>", "<container-name>");
var iterator = container.GetItemQueryIterator<dynamic>("SELECT * FROM c");
while (iterator.HasMoreResults)
{
foreach (var item in await iterator.ReadNextAsync())
{
Console.WriteLine(item);
}
}