Tokens de recursos en Azure Cosmos DB
SE APLICA A: NoSQL MongoDB Cassandra Gremlin Table
Los tokens de recursos son credenciales que pueden proporcionar acceso específico a contenedores, claves de particiones o elementos. Se pueden ajustar para conceder permisos específicos por usuario y trabajar directamente con la API REST para Azure Cosmos DB. Los tokens de recursos proporcionan una alternativa a la autenticación mediante claves principales o secundarias configuradas para acceso de lectura y escritura o de solo lectura.
Importante
Microsoft recomienda usar el flujo de autenticación más seguro disponible. El flujo de autenticación que se describe en este procedimiento requiere un alto grado de confianza en la aplicación y conlleva riesgos que no están presentes en otros flujos. Solo debe usar este flujo cuando otros flujos más seguros, como las identidades administradas, no sean viables.
Para Azure Cosmos DB, la autenticación de Microsoft Entra es el mecanismo de autenticación más seguro disponible. Revise la guía de seguridad adecuada para la API:
Las bibliotecas cliente nativas de Azure Cosmos DB controlan directamente la generación y administración de tokens de recursos. Sin embargo, si usa REST, debe construir los encabezados de solicitud o autenticación usted mismo. Para más información sobre cómo crear encabezados de autenticación para REST, consulte Control de acceso en recursos de Azure Cosmos DB en REST.
Requisitos previos
- Una cuenta de Azure Cosmos DB existente
- SDK de .NET 8 (o posterior)
Creación de un usuario y permiso
En primer lugar, debe crear un usuario mediante el SDK de Azure Cosmos DB para NoSQL. A continuación, puede crear un permiso para el usuario.
Nota:
Muchas API, como Cassandra y Gremlin, no exponen una interfaz a través de sus SDK nativos para crear tokens de recursos. Para usar tokens de recursos, debe usar los SDK de NoSQL para interactuar con el punto de conexión de la cuenta, independientemente de la API que haya seleccionado.
Obtenga el punto de conexión NoSQL y una de las claves de lectura y escritura de la cuenta de la cuenta existente.
Agregue la versión 3.x del
Microsoft.Azure.Cosmos
paquete al proyecto de .NET.dotnet add package Microsoft.Azure.Cosmos --version 3.*
Agregue un bloque using para el espacio de nombres
Microsoft.Azure.Cosmos
.using Microsoft.Azure.Cosmos;
Cree un nuevo cliente que especifique el punto de conexión noSQL de la cuenta y una clave de lectura y escritura.
CosmosClient client = new( accountEndpoint: "<account-nosql-endpoint>", authKeyOrResourceToken: "<account-read-write-key>" );
Nota:
Debe usar el punto de conexión NoSQL para la cuenta que normalmente tiene este formato:
https://<account-name>.documents.azure.com:443/
.Obtiene la base de datos y los objetos de contenedor.
Database database = client.GetDatabase("<database-name>"); Container container = database.GetContainer("<container-name>");
Cree un nuevo usuario dentro de la base de datos que especifique el nombre del usuario.
User user = await database.CreateUserAsync("demo-user");
Cree un nuevo permiso para el usuario que especifique el modo de permiso (
Read
oAll
), un identificador único, el contenedor con ámbito y un ámbito de clave de partición opcional.PermissionProperties permissionProperties = new( id: "read-permission", permissionMode: PermissionMode.All, container: container, resourcePartitionKey: new PartitionKey("partition-key-value") ); Permission permission = await user.CreatePermissionAsync(permissionProperties);
Obtención de un token de recurso
Ahora, use el SDK de NoSQL de nuevo para obtener un token de recurso de la cuenta.
PermissionResponse response = await permission.ReadAsync();
string resourceToken = response.Resource.Token;
Uso del token de recurso
Por último, puede usar el SDK nativo para la API para usar el token de recurso.
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);
}
}