Tokens de recurso no Azure Cosmos DB
APLICA-SE A: NoSQL MongoDB Cassandra Gremlin Tabela
Os tokens de recursos são credenciais que podem fornecer acesso específico a contêineres, partições, chaves ou itens. Eles podem ser ajustados para conceder permissões específicas por usuário e trabalhar diretamente com a API REST para Azure Cosmos DB. Os tokens de recursos fornecem uma alternativa à autenticação usando chaves primárias ou secundárias configuradas para acesso de leitura/gravação ou somente leitura.
Importante
A Microsoft recomenda que você use o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento requer um grau muito alto de confiança no aplicativo e acarreta riscos que não estão presentes em outros fluxos. Você só deve usar esse fluxo quando outros fluxos mais seguros, como identidades gerenciadas, não forem viáveis.
Para o Azure Cosmos DB, a autenticação do Microsoft Entra é o mecanismo de autenticação mais seguro disponível. Consulte o guia de segurança apropriado para sua API:
As bibliotecas de cliente nativas do Azure Cosmos DB lidam diretamente com a geração e o gerenciamento de tokens de recursos. No entanto, se você usar REST, deverá construir os cabeçalhos de solicitação/autenticação por conta própria. Para obter mais informações sobre como criar cabeçalhos de autenticação para REST, consulte Controle de acesso em recursos do Azure Cosmos DB em REST.
Pré-requisitos
- Uma conta existente do Azure Cosmos DB
- SDK do .NET 8 (ou posterior)
Criar um usuário e permissão
Primeiro, você deve criar um usuário usando o SDK do Azure Cosmos DB para NoSQL. Em seguida, você pode criar uma permissão para o usuário.
Nota
Muitas APIs, como Cassandra e Gremlin, não expõem uma interface por meio de seus SDKs nativos para criar tokens de recursos. Para usar tokens de recursos, você deve usar os SDKs NoSQL para interagir com seu ponto de extremidade de conta, independentemente da API selecionada.
Obtenha o ponto de extremidade NoSQL e uma das chaves de leitura/gravação da conta da sua conta existente.
Adicione a versão 3.x do
Microsoft.Azure.Cosmos
pacote ao seu projeto .NET.dotnet add package Microsoft.Azure.Cosmos --version 3.*
Adicione um bloco using para o
Microsoft.Azure.Cosmos
namespace.using Microsoft.Azure.Cosmos;
Crie um novo cliente especificando sua conta, ponto de extremidade NoSQL e uma chave de leitura-gravação.
CosmosClient client = new( accountEndpoint: "<account-nosql-endpoint>", authKeyOrResourceToken: "<account-read-write-key>" );
Nota
Você deve usar o ponto de extremidade NoSQL para sua conta que normalmente está neste formato:
https://<account-name>.documents.azure.com:443/
.Obtenha seu banco de dados e objetos de contêiner.
Database database = client.GetDatabase("<database-name>"); Container container = database.GetContainer("<container-name>");
Crie um novo usuário dentro do banco de dados especificando o nome do usuário.
User user = await database.CreateUserAsync("demo-user");
Crie uma nova permissão para o usuário especificando o modo de permissão (
Read
ouAll
), um identificador exclusivo, o contêiner com escopo e um escopo de chave de partição opcional.PermissionProperties permissionProperties = new( id: "read-permission", permissionMode: PermissionMode.All, container: container, resourcePartitionKey: new PartitionKey("partition-key-value") ); Permission permission = await user.CreatePermissionAsync(permissionProperties);
Obter um token de recurso
Agora, use o SDK NoSQL novamente para obter um token de recurso da conta.
PermissionResponse response = await permission.ReadAsync();
string resourceToken = response.Resource.Token;
Usar o token de recurso
Finalmente, você pode usar o SDK nativo para sua API para usar o 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);
}
}