Udostępnij za pośrednictwem


Tokeny zasobów w usłudze Azure Cosmos DB

DOTYCZY: NoSQL MongoDB Kasandra Gremlin Stół

Tokeny zasobów to poświadczenia, które mogą zapewnić określony dostęp do kontenerów, kluczy partycji lub elementów. Można je dostosować, aby przyznać określone uprawnienia dla poszczególnych użytkowników i pracować bezpośrednio z interfejsem API REST dla usługi Azure Cosmos DB. Tokeny zasobów stanowią alternatywę uwierzytelniania przy użyciu kluczy podstawowych lub pomocniczych skonfigurowanych do odczytu/zapisu lub dostępu tylko do odczytu.

Ważne

Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze wymaga bardzo wysokiego poziomu zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Tego przepływu należy używać tylko wtedy, gdy inne bezpieczniejsze przepływy, takie jak tożsamości zarządzane, nie są opłacalne.

W przypadku usługi Azure Cosmos DB uwierzytelnianie firmy Microsoft Entra jest najbezpieczniejszym dostępnym mechanizmem uwierzytelniania. Zapoznaj się z odpowiednim przewodnikiem dotyczącym zabezpieczeń interfejsu API:

Natywne biblioteki klienckie usługi Azure Cosmos DB obsługują generowanie tokenów zasobów i zarządzanie nimi bezpośrednio. Jeśli jednak używasz architektury REST, musisz samodzielnie skonstruować nagłówki żądań/uwierzytelniania. Aby uzyskać więcej informacji na temat tworzenia nagłówków uwierzytelniania dla interfejsu REST, zobacz Kontrola dostępu do zasobów usługi Azure Cosmos DB w usłudze REST.

Wymagania wstępne

  • Istniejące konto usługi Azure Cosmos DB
  • Zestaw .NET 8 SDK (lub nowszy)

Tworzenie użytkownika i uprawnienia

Najpierw należy utworzyć użytkownika przy użyciu zestawu SDK usługi Azure Cosmos DB for NoSQL. Następnie możesz utworzyć uprawnienie dla użytkownika.

Uwaga

Wiele interfejsów API, takich jak Cassandra i Gremlin, nie udostępnia interfejsu za pośrednictwem natywnych zestawów SDK w celu utworzenia tokenów zasobów. Aby używać tokenów zasobów, należy użyć zestawów SDK NoSQL do interfejsu z punktem końcowym konta niezależnie od wybranego interfejsu API.

  1. Uzyskaj punkt końcowy NoSQL i jeden z kluczy odczytu i zapisu konta z istniejącego konta.

  2. Dodaj wersję Microsoft.Azure.Cosmos pakietu 3.x do projektu .NET.

    dotnet add package Microsoft.Azure.Cosmos --version 3.*
    
  3. Dodaj blok using dla Microsoft.Azure.Cosmos przestrzeni nazw.

    using Microsoft.Azure.Cosmos;
    
  4. Utwórz nowego klienta określającego punkt końcowy NoSQL konta i klucz odczytu i zapisu.

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

    Uwaga

    Musisz użyć punktu końcowego NoSQL dla konta, które zwykle ma następujący format: https://<account-name>.documents.azure.com:443/.

  5. Pobierz bazę danych i obiekty kontenera.

    Database database = client.GetDatabase("<database-name>");
    Container container = database.GetContainer("<container-name>");
    
  6. Utwórz nowego użytkownika w bazie danych, określając nazwę użytkownika.

    User user = await database.CreateUserAsync("demo-user");
    
  7. Utwórz nowe uprawnienie dla użytkownika określającego tryb uprawnień (Read lub All), unikatowy identyfikator, kontener o określonym zakresie i opcjonalny zakres klucza partycji.

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

Uzyskiwanie tokenu zasobu

Teraz użyj ponownie zestawu SDK NoSQL, aby uzyskać token zasobu z konta.

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

Korzystanie z tokenu zasobu

Na koniec możesz użyć natywnego zestawu SDK dla interfejsu API, aby użyć tokenu zasobu.

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