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.
Uzyskaj punkt końcowy NoSQL i jeden z kluczy odczytu i zapisu konta z istniejącego konta.
Dodaj wersję
Microsoft.Azure.Cosmos
pakietu 3.x do projektu .NET.dotnet add package Microsoft.Azure.Cosmos --version 3.*
Dodaj blok using dla
Microsoft.Azure.Cosmos
przestrzeni nazw.using Microsoft.Azure.Cosmos;
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/
.Pobierz bazę danych i obiekty kontenera.
Database database = client.GetDatabase("<database-name>"); Container container = database.GetContainer("<container-name>");
Utwórz nowego użytkownika w bazie danych, określając nazwę użytkownika.
User user = await database.CreateUserAsync("demo-user");
Utwórz nowe uprawnienie dla użytkownika określającego tryb uprawnień (
Read
lubAll
), 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);
}
}