Tokeny prostředků ve službě Azure Cosmos DB

PLATÍ PRO: NoSQL MongoDB Cassandra Skřítek Stůl

Tokeny prostředků jsou přihlašovací údaje, které umožňují konkrétní přístup ke kontejnerům, klíčům oddílů nebo položkám. Dají se vyladit tak, aby udělovaly konkrétní oprávnění jednotlivým uživatelům a pracovaly přímo s rozhraním REST API pro Azure Cosmos DB. Tokeny prostředků poskytují alternativu k ověřování pomocí primárních nebo sekundárních klíčů nakonfigurovaných pro přístup jen pro čtení a zápis nebo jen pro čtení.

Důležité

Microsoft doporučuje používat nejbezpečnější dostupný tok ověřování. Ověřovací tok popsaný v tomto postupu vyžaduje velmi vysoký stupeň důvěryhodnosti v aplikaci a nese rizika, která nejsou přítomna v jiných tocích. Tento tok byste měli použít jenom v případě, že jiné bezpečnější toky, jako jsou spravované identity, nejsou přijatelné.

Pro službu Azure Cosmos DB je ověřování Microsoft Entra nejbezpečnějším dostupným mechanismem ověřování. Projděte si příslušného průvodce zabezpečením pro vaše rozhraní API:

Nativní klientské knihovny Azure Cosmos DB zpracovávají generování a správu tokenů prostředků přímo. Pokud však používáte REST, musíte vytvořit hlavičky požadavku/ověřování sami. Další informace o vytváření hlaviček ověřování pro REST najdete v tématu Řízení přístupu k prostředkům Azure Cosmos DB v REST.

Požadavky

  • Existující účet služby Azure Cosmos DB
  • Sada .NET 8 SDK (nebo novější)

Vytvoření uživatele a oprávnění

Nejprve musíte vytvořit uživatele pomocí sady Azure Cosmos DB for NoSQL SDK. Pak můžete pro uživatele vytvořit oprávnění.

Poznámka:

Mnoho rozhraní API, jako jsou Cassandra a Gremlin, nevystavuje rozhraní prostřednictvím nativních sad SDK pro vytváření tokenů prostředků. Pokud chcete používat tokeny prostředků, musíte použít sady SDK NoSQL pro rozhraní s koncovým bodem vašeho účtu bez ohledu na rozhraní API, které jste vybrali.

  1. Získejte koncový bod NoSQL a jeden z klíčů pro čtení i zápis z existujícího účtu.

  2. Přidejte do projektu .NET verzi Microsoft.Azure.Cosmos balíčku 3.x.

    dotnet add package Microsoft.Azure.Cosmos --version 3.*
    
  3. Přidejte blok using pro Microsoft.Azure.Cosmos obor názvů.

    using Microsoft.Azure.Cosmos;
    
  4. Vytvořte nového klienta určujícího koncový bod NoSQL vašeho účtu a klíč pro čtení i zápis.

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

    Poznámka:

    Pro svůj účet, který je obvykle v tomto formátu, musíte použít koncový bod NoSQL: https://<account-name>.documents.azure.com:443/.

  5. Získejte databázi a kontejnerové objekty.

    Database database = client.GetDatabase("<database-name>");
    Container container = database.GetContainer("<container-name>");
    
  6. Vytvořte nového uživatele v databázi, který určuje jméno uživatele.

    User user = await database.CreateUserAsync("demo-user");
    
  7. Vytvořte nové oprávnění pro uživatele, který určuje režim oprávnění (Read nebo All), jedinečný identifikátor, vymezený kontejner a volitelný obor klíče oddílu.

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

Získání tokenu prostředku

Teď znovu použijte sadu NoSQL SDK k získání tokenu prostředku z účtu.

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

Použití tokenu prostředku

Nakonec můžete k použití tokenu prostředku použít nativní sadu SDK pro vaše rozhraní API.

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