Delen via


Resourcetokens in Azure Cosmos DB

VAN TOEPASSING OP: NoSQL MongoDB Cassandra Gremlin Tafel

Resourcetokens zijn referenties die specifieke toegang kunnen bieden tot containers, partitiesleutels of items. Ze kunnen worden afgestemd om specifieke machtigingen per gebruiker te verlenen en rechtstreeks te werken met de REST API voor Azure Cosmos DB. Resourcetokens bieden een alternatief voor verificatie met behulp van primaire of secundaire sleutels die zijn geconfigureerd voor lees-/schrijf- of alleen-lezentoegang.

Belangrijk

Microsoft raadt u aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die in deze procedure wordt beschreven, vereist een zeer hoge mate van vertrouwen in de toepassing en brengt risico's met zich mee die niet aanwezig zijn in andere stromen. U moet deze stroom alleen gebruiken wanneer andere veiligere stromen, zoals beheerde identiteiten, niet haalbaar zijn.

Voor Azure Cosmos DB is Microsoft Entra-verificatie het veiligste verificatiemechanisme dat beschikbaar is. Bekijk de juiste beveiligingshandleiding voor uw API:

De systeemeigen Azure Cosmos DB-clientbibliotheken verwerken het genereren en beheren van resources rechtstreeks. Als u ECHTER REST gebruikt, moet u zelf de aanvraag-/verificatieheaders samenstellen. Zie toegangsbeheer voor Azure Cosmos DB-resources in REST voor meer informatie over het maken van verificatieheaders voor REST.

Vereisten

  • Een bestaand Azure Cosmos DB-account
  • .NET 8 SDK (of hoger)

Een gebruiker en machtiging maken

Eerst moet u een gebruiker maken met behulp van de Azure Cosmos DB for NoSQL SDK. Vervolgens kunt u een machtiging voor de gebruiker maken.

Notitie

Veel API's, zoals Cassandra en Gremlin, maken geen interface beschikbaar via hun systeemeigen SDK's om resourcetokens te maken. Als u resourcetokens wilt gebruiken, moet u de NoSQL SDK's gebruiken om te interfacen met uw accounteindpunt, ongeacht de API die u hebt geselecteerd.

  1. Haal het NoSQL-eindpunt en een van de lees-/schrijfsleutels van het account op uit uw bestaande account.

  2. Voeg de 3.x-versie van het Microsoft.Azure.Cosmos pakket toe aan uw .NET-project.

    dotnet add package Microsoft.Azure.Cosmos --version 3.*
    
  3. Voeg een using-blok toe voor de Microsoft.Azure.Cosmos naamruimte.

    using Microsoft.Azure.Cosmos;
    
  4. Maak een nieuwe client die het NoSQL-eindpunt van uw account en een lees-/schrijfsleutel opgeeft.

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

    Notitie

    U moet het NoSQL-eindpunt gebruiken voor uw account dat doorgaans de volgende indeling heeft: https://<account-name>.documents.azure.com:443/

  5. Haal uw database- en containerobjecten op.

    Database database = client.GetDatabase("<database-name>");
    Container container = database.GetContainer("<container-name>");
    
  6. Maak een nieuwe gebruiker in de database die de naam van de gebruiker opgeeft.

    User user = await database.CreateUserAsync("demo-user");
    
  7. Maak een nieuwe machtiging voor de gebruiker die de machtigingsmodus (Read of All), een unieke id, de scoped container en een optioneel partitiesleutelbereik opgeeft.

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

Een resourcetoken verkrijgen

Gebruik nu de NoSQL SDK opnieuw om een resourcetoken op te halen uit het account.

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

Het resourcetoken gebruiken

Ten slotte kunt u de systeemeigen SDK voor uw API gebruiken om het resourcetoken te gebruiken.

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