Nawiązywanie połączenia z aplikacji z zasobami bez obsługi poświadczeń
Zasoby platformy Azure z tożsamościami zarządzanymi obsługują zawsze opcję określenia tożsamości zarządzanej w celu nawiązania połączenia z zasobami platformy Azure obsługującymi uwierzytelnianie firmy Microsoft Entra. Obsługa tożsamości zarządzanych sprawia, że deweloperzy nie muszą zarządzać poświadczeniami w kodzie. Tożsamości zarządzane to zalecana opcja uwierzytelniania podczas pracy z zasobami platformy Azure, które je obsługują. Zapoznaj się z omówieniem tożsamości zarządzanych.
Na tej stronie pokazano, jak skonfigurować usługę App Service, aby mogła łączyć się z usługą Azure Key Vault, usługą Azure Storage i programem Microsoft SQL Server. Te same zasady mogą być używane dla dowolnego zasobu platformy Azure, który obsługuje tożsamości zarządzane i które będą łączyć się z zasobami obsługującymi uwierzytelnianie firmy Microsoft Entra.
Przykłady kodu używają biblioteki klienta tożsamości platformy Azure, która jest zalecaną metodą, ponieważ automatycznie obsługuje wiele kroków, w tym uzyskiwanie tokenu dostępu używanego w połączeniu.
Z jakimi zasobami mogą łączyć się tożsamości zarządzane?
Tożsamość zarządzana może łączyć się z dowolnym zasobem, który obsługuje uwierzytelnianie firmy Microsoft Entra. Ogólnie rzecz biorąc, nie jest wymagana specjalna obsługa zasobu, aby umożliwić tożsamościom zarządzanym łączenie się z nim.
Niektóre zasoby nie obsługują uwierzytelniania entra firmy Microsoft lub ich biblioteka kliencka nie obsługuje uwierzytelniania przy użyciu tokenu. Przeczytaj, aby zapoznać się z naszymi wskazówkami dotyczącymi bezpiecznego uzyskiwania dostępu do poświadczeń przy użyciu tożsamości zarządzanej bez konieczności przechowywania ich w kodzie lub konfiguracji aplikacji.
Tworzenie tożsamości zarządzanej
Istnieją dwa typy tożsamości zarządzanych: przypisane przez system i przypisane przez użytkownika. Tożsamości przypisane przez system są bezpośrednio połączone z pojedynczym zasobem platformy Azure. Gdy zasób platformy Azure zostanie usunięty, jest to tożsamość. Tożsamość zarządzana przypisana przez użytkownika może być skojarzona z wieloma zasobami platformy Azure, a jej cykl życia jest niezależny od tych zasobów.
W większości scenariuszy zalecamy użycie tożsamości zarządzanej przypisanej przez użytkownika. Jeśli używany zasób źródłowy nie obsługuje tożsamości zarządzanych przypisanych przez użytkownika, zapoznaj się z dokumentacją tego dostawcy zasobów, aby dowiedzieć się, jak skonfigurować go tak, aby miała tożsamość zarządzaną przypisaną przez system.
Ważne
Konto używane do tworzenia tożsamości zarządzanych wymaga roli, takiej jak "Współautor tożsamości zarządzanej", aby utworzyć nową tożsamość zarządzaną przypisaną przez użytkownika.
Utwórz tożsamość zarządzaną przypisaną przez użytkownika przy użyciu preferowanej opcji:
- Witryna Azure Portal
- Interfejs wiersza polecenia platformy Azure
- Azure PowerShell
- Resource Manager
- REST
Po utworzeniu tożsamości zarządzanej przypisanej przez użytkownika zanotuj clientId
wartości i principalId
zwracane podczas tworzenia tożsamości zarządzanej. principalId
Używasz funkcji podczas dodawania uprawnień i clientId
w kodzie aplikacji.
Konfigurowanie usługi App Service przy użyciu tożsamości zarządzanej przypisanej przez użytkownika
Aby można było użyć tożsamości zarządzanej w kodzie, musimy przypisać ją do usługi App Service, która będzie jej używać. Proces konfigurowania usługi App Service do korzystania z tożsamości zarządzanej przypisanej przez użytkownika wymaga określenia identyfikatora zasobu tożsamości zarządzanej w konfiguracji aplikacji.
Dodawanie uprawnień do tożsamości
Po skonfigurowaniu usługi App Service do używania tożsamości zarządzanej przypisanej przez użytkownika należy przyznać niezbędne uprawnienia tożsamości. W tym scenariuszu używamy tej tożsamości do interakcji z usługą Azure Storage, dlatego należy użyć systemu kontroli dostępu opartej na rolach (RBAC) platformy Azure w celu udzielenia uprawnień tożsamości zarządzanej przypisanej przez użytkownika do zasobu.
Ważne
Do dodania przypisań ról potrzebna będzie rola, taka jak "Administrator dostępu użytkowników" lub "Właściciel" zasobu docelowego. Upewnij się, że udzielasz najmniejszego uprawnienia wymaganego do uruchomienia aplikacji.
Wszelkie zasoby, do których chcesz uzyskać dostęp, wymagają udzielenia uprawnień tożsamości. Jeśli na przykład zażądasz tokenu dostępu do usługi Key Vault, musisz również dodać zasady dostępu, które obejmują tożsamość zarządzaną aplikacji lub funkcji. W przeciwnym razie wywołania usługi Key Vault zostaną odrzucone, nawet jeśli używasz prawidłowego tokenu. To samo dotyczy usługi Azure SQL Database. Aby dowiedzieć się więcej o zasobach obsługujących tokeny firmy Microsoft Entra, zobacz Usługi platformy Azure, które obsługują uwierzytelnianie Firmy Microsoft Entra.
Używanie tożsamości zarządzanych w kodzie
Po wykonaniu opisanych powyżej kroków usługa App Service ma tożsamość zarządzaną z uprawnieniami do zasobu platformy Azure. Za pomocą tożsamości zarządzanej można uzyskać token dostępu, którego kod może używać do interakcji z zasobami platformy Azure, zamiast przechowywać poświadczenia w kodzie.
Zalecamy użycie biblioteki tożsamości platformy Azure dla preferowanego języka programowania. Biblioteka uzyskuje tokeny dostępu, co ułatwia nawiązywanie połączenia z zasobami docelowymi.
Przeczytaj więcej na temat bibliotek tożsamości platformy Azure poniżej:
- Biblioteka tożsamości platformy Azure dla platformy .NET
- Biblioteka tożsamości platformy Azure dla języka Java
- Biblioteka tożsamości platformy Azure dla języka JavaScript
- Biblioteka tożsamości platformy Azure dla języka Python
- Moduł tożsamości platformy Azure dla języka Go
- Biblioteka tożsamości platformy Azure dla języka C++
Korzystanie z biblioteki tożsamości platformy Azure w środowisku projektowym
Biblioteki tożsamości platformy Azure zapewniają DefaultAzureCredential
typ. DefaultAzureCredential
automatycznie próbuje uwierzytelnić się za pośrednictwem wielu mechanizmów, w tym zmiennych środowiskowych lub logowania interakcyjnego. Typ poświadczeń może być używany w środowisku deweloperów przy użyciu własnych poświadczeń. Można go również używać w środowisku produkcyjnym platformy Azure przy użyciu tożsamości zarządzanej. Podczas wdrażania aplikacji nie są wymagane żadne zmiany kodu.
Jeśli używasz tożsamości zarządzanych przypisanych przez użytkownika, należy również jawnie określić tożsamość zarządzaną przypisaną przez użytkownika, za pomocą której chcesz uwierzytelnić się, przekazując identyfikator klienta tożsamości jako parametr. Identyfikator klienta można pobrać, przechodząc do tożsamości w witrynie Azure Portal.
Uzyskiwanie dostępu do obiektu blob w usłudze Azure Storage
using Azure.Identity;
using Azure.Storage.Blobs;
// code omitted for brevity
// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);
var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");
if (blobClient1.Exists())
{
var downloadedBlob = blobClient1.Download();
string blobContents = downloadedBlob.Value.Content.ToString();
}
Uzyskiwanie dostępu do wpisu tajnego przechowywanego w usłudze Azure Key Vault
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;
// code omitted for brevity
// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);
var client = new SecretClient(
new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
credential);
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;
Uzyskiwanie dostępu do usługi Azure SQL Database
using Azure.Identity;
using Microsoft.Data.SqlClient;
// code omitted for brevity
// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientID
};
AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));
using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();
Nawiązywanie połączenia z zasobami, które nie obsługują identyfikatora Entra firmy Microsoft ani uwierzytelniania opartego na tokenach w bibliotekach
Niektóre zasoby platformy Azure nie obsługują jeszcze uwierzytelniania firmy Microsoft Entra lub ich biblioteki klienckie nie obsługują uwierzytelniania przy użyciu tokenu. Zazwyczaj te zasoby to technologie typu open source, które oczekują nazwy użytkownika i hasła lub klucza dostępu w parametry połączenia.
Aby uniknąć przechowywania poświadczeń w kodzie lub konfiguracji aplikacji, możesz przechowywać poświadczenia jako wpis tajny w usłudze Azure Key Vault. Korzystając z powyższego przykładu, możesz pobrać wpis tajny z usługi Azure KeyVault przy użyciu tożsamości zarządzanej i przekazać poświadczenia do parametry połączenia. Takie podejście oznacza, że żadne poświadczenia nie muszą być obsługiwane bezpośrednio w kodzie lub środowisku.
Wskazówki dotyczące bezpośredniej obsługi tokenów
W niektórych scenariuszach możesz ręcznie uzyskać tokeny dla tożsamości zarządzanych zamiast używać wbudowanej metody w celu nawiązania połączenia z zasobem docelowym. Te scenariusze nie obejmują biblioteki klienta dla używanego języka programowania lub zasobu docelowego, z którym nawiązujesz połączenie, lub łączenia się z zasobami, które nie są uruchomione na platformie Azure. Podczas ręcznego uzyskiwania tokenów udostępniamy następujące wskazówki:
Buforowanie uzyskanych tokenów
W celu zapewnienia wydajności i niezawodności zalecamy buforowanie tokenów aplikacji w pamięci lokalnej lub zaszyfrowanie, jeśli chcesz zapisać je na dysku. Ponieważ tokeny tożsamości zarządzanej są ważne przez 24 godziny, nie ma korzyści wynikających z regularnego żądania nowych tokenów, ponieważ buforowany token zostanie zwrócony z punktu końcowego wystawiającego tokeny. Jeśli przekroczysz limity żądań, wystąpi ograniczenie szybkości i zostanie wyświetlony błąd HTTP 429.
Po uzyskaniu tokenu możesz ustawić, że pamięć podręczna tokenu wygaśnie 5 minut przed expires_on
(lub równoważną właściwością), która zostanie zwrócona po wygenerowaniu tokenu.
Inspekcja tokenów
Aplikacja nie powinna polegać na zawartości tokenu. Zawartość tokenu jest przeznaczona tylko dla odbiorców (zasobu docelowego), do którego uzyskuje się dostęp, a nie klienta żądającego tokenu. Zawartość tokenu może ulec zmianie lub zostać zaszyfrowana w przyszłości.
Nie ujawniaj ani nie przenosij tokenów
Tokeny powinny być traktowane jak poświadczenia. Nie ujawniaj ich użytkownikom ani innym usługom; na przykład rozwiązania do rejestrowania/monitorowania. Nie należy ich przenosić z zasobu źródłowego, który z nich korzysta, poza uwierzytelnianiem względem zasobu docelowego.
Następne kroki
- Jak używać tożsamości zarządzanych dla usług App Service i Azure Functions
- Jak używać tożsamości zarządzanych z usługą Azure Container Instances
- Implementowanie tożsamości zarządzanych dla zasobów platformy Microsoft Azure
- Używanie federacji tożsamości obciążenia dla tożsamości zarządzanych w celu uzyskania dostępu do chronionych zasobów firmy Microsoft bez zarządzania wpisami tajnymi