Tokens de recurso no Azure Cosmos DB
APLICA-SE AO: NoSQL MongoDB Cassandra Gremlin Table
Tokens de recurso são credenciais que podem fornecer acesso específico a contêineres, chaves de partição 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 recurso 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 usar o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento exige um grau muito alto de confiança no aplicativo e traz 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. Revise 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 token de recurso. 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 for NoSQL. Em seguida, você pode criar uma permissão para o usuário.
Observação
Muitas APIs, como Cassandra e Gremlin, não expõem uma interface por meio de seus SDKs nativos para criar tokens de recurso. Para usar tokens de recurso, você deve usar os SDKs NoSQL para fazer interface com o endpoint da sua conta, independentemente da API selecionada.
Obtenha o endpoint 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.*
Adicionar um bloco using para o namespace
Microsoft.Azure.Cosmos
.using Microsoft.Azure.Cosmos;
Crie um novo cliente especificando o ponto de extremidade NoSQL da sua conta e uma chave de leitura/gravação.
CosmosClient client = new( accountEndpoint: "<account-nosql-endpoint>", authKeyOrResourceToken: "<account-read-write-key>" );
Observação
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 no 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
Por fim, você pode usar o SDK nativo da 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);
}
}