Condividi tramite


Token di risorsa in Azure Cosmos DB

SI APPLICA A: NoSQL MongoDB Cassandra Gremlin Tabella

I token di risorsa sono credenziali che possono fornire accesso specifico a contenitori, chiavi di partizioni o elementi. Possono essere ottimizzati per concedere autorizzazioni specifiche per ogni utente e usare direttamente l'API REST per Azure Cosmos DB. I token di risorsa offrono un'alternativa all'autenticazione usando chiavi primarie o secondarie configurate per l'accesso in lettura/scrittura o in sola lettura.

Importante

Microsoft consiglia di usare il flusso di autenticazione più sicuro disponibile. Il flusso di autenticazione descritto in questa procedura richiede un livello di attendibilità molto elevato nell'applicazione e comporta rischi che non sono presenti in altri flussi. Si consiglia di usare questo flusso solo quando altri flussi più sicuri, come le identità gestite, non sono validi.

Per Azure Cosmos DB, l'autenticazione Microsoft Entra è il meccanismo di autenticazione più sicuro disponibile. Esaminare la guida alla sicurezza appropriata per l'API:

Le librerie client native di Azure Cosmos DB gestiscono direttamente la generazione e la gestione dei token delle risorse. Tuttavia, se si usa REST, è necessario costruire manualmente le intestazioni di richiesta/autenticazione. Per altre informazioni sulla creazione di intestazioni di autenticazione per REST, vedere Controllo di accesso nelle risorse di Azure Cosmos DB in REST.

Prerequisiti

  • Un account Azure Cosmos DB esistente
  • .NET 8 SDK (o versione successiva)

Creare un utente e un'autorizzazione

Prima di tutto, è necessario creare un utente usando Azure Cosmos DB per NoSQL SDK. È quindi possibile creare un'autorizzazione per l'utente.

Nota

Molte API, ad esempio Cassandra e Gremlin, non espongono un'interfaccia tramite gli SDK nativi per creare token di risorse. Per usare i token di risorsa, è necessario usare gli SDK NoSQL per interfacciarsi con l'endpoint dell'account indipendentemente dall'API selezionata.

  1. Ottenere l'endpoint NoSQL e una delle chiavi di lettura/scrittura dell'account dall'account esistente.

  2. Aggiungere la versione 3.x del Microsoft.Azure.Cosmos pacchetto al progetto .NET.

    dotnet add package Microsoft.Azure.Cosmos --version 3.*
    
  3. Aggiungere un blocco Using per lo spazio dei nomi Microsoft.Azure.Cosmos.

    using Microsoft.Azure.Cosmos;
    
  4. Creare un nuovo client specificando l'endpoint NoSQL dell'account e una chiave di lettura/scrittura.

    CosmosClient client = new(
        accountEndpoint: "<account-nosql-endpoint>",
        authKeyOrResourceToken: "<account-read-write-key>"
    );
    

    Nota

    È necessario usare l'endpoint NoSQL per l'account in genere nel formato seguente: https://<account-name>.documents.azure.com:443/.

  5. Ottenere il database e gli oggetti contenitore.

    Database database = client.GetDatabase("<database-name>");
    Container container = database.GetContainer("<container-name>");
    
  6. Creare un nuovo utente all'interno del database specificando il nome dell'utente.

    User user = await database.CreateUserAsync("demo-user");
    
  7. Creare una nuova autorizzazione per l'utente specificando la modalità di autorizzazione (Read o All), un identificatore univoco, il contenitore con ambito e un ambito di chiave di partizione facoltativo.

    PermissionProperties permissionProperties = new(
        id: "read-permission",
        permissionMode: PermissionMode.All,
        container: container,
        resourcePartitionKey: new PartitionKey("partition-key-value")
    );
    Permission permission = await user.CreatePermissionAsync(permissionProperties);
    

Ottenere un token di risorsa

Usare di nuovo NoSQL SDK per ottenere un token di risorsa dall'account.

PermissionResponse response = await permission.ReadAsync();
string resourceToken = response.Resource.Token;

Usare il token della risorsa

Infine, è possibile usare l'SDK nativo per l'API per usare il token di risorsa.

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);
    }
}