Compartilhar via


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.

  1. Obtenha o endpoint NoSQL e uma das chaves de leitura/gravação da conta da sua conta existente.

  2. Adicione a versão 3.x do Microsoft.Azure.Cosmos pacote ao seu projeto .NET.

    dotnet add package Microsoft.Azure.Cosmos --version 3.*
    
  3. Adicionar um bloco using para o namespace Microsoft.Azure.Cosmos.

    using Microsoft.Azure.Cosmos;
    
  4. 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/.

  5. Obtenha seu banco de dados e objetos de contêiner.

    Database database = client.GetDatabase("<database-name>");
    Container container = database.GetContainer("<container-name>");
    
  6. Crie um novo usuário no banco de dados especificando o nome do usuário.

    User user = await database.CreateUserAsync("demo-user");
    
  7. Crie uma nova permissão para o usuário especificando o modo de permissão (Read ou All), 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);
    }
}