Konfigurowanie połączeń bez hasła między wieloma aplikacjami i usługami platformy Azure

Aplikacje często wymagają bezpiecznych połączeń między wieloma usługami platformy Azure jednocześnie. Na przykład wystąpienie usługi aplikacja systemu Azure przedsiębiorstwa może łączyć się z kilkoma różnymi kontami magazynu, wystąpieniem bazy danych Azure SQL Database, magistralą usług i nie tylko.

Tożsamości zarządzane to zalecana opcja uwierzytelniania dla bezpiecznych połączeń bez hasła między zasobami platformy Azure. Deweloperzy nie muszą ręcznie śledzić wielu różnych wpisów tajnych dla tożsamości zarządzanych i zarządzać nimi, ponieważ większość tych zadań jest obsługiwana wewnętrznie przez platformę Azure. W tym samouczku przedstawiono sposób zarządzania połączeniami między wieloma usługami przy użyciu tożsamości zarządzanych i biblioteki klienta tożsamości platformy Azure.

Porównanie typów tożsamości zarządzanych

Platforma Azure udostępnia następujące typy tożsamości zarządzanych:

  • Tożsamości zarządzane przypisane przez system są bezpośrednio powiązane z pojedynczym zasobem platformy Azure. Po włączeniu tożsamości zarządzanej przypisanej przez system w usłudze platforma Azure utworzy połączoną tożsamość i będzie obsługiwać zadania administracyjne dla tej tożsamości wewnętrznie. Po usunięciu zasobu platformy Azure tożsamość zostanie również usunięta.
  • Tożsamości zarządzane przypisane przez użytkownika to niezależne tożsamości utworzone przez administratora i mogą być skojarzone z co najmniej jednym zasobem platformy Azure. Cykl życia tożsamości jest niezależny od tych zasobów.

Więcej informacji na temat najlepszych rozwiązań i sposobu używania tożsamości przypisanych przez system w porównaniu z tożsamościami przypisanymi przez użytkownika można przeczytać w zaleceniach dotyczących najlepszych rozwiązań dotyczących tożsamości.

Eksplorowanie domyślneAzureCredential

Tożsamości zarządzane są zwykle implementowane w kodzie aplikacji za pośrednictwem klasy wywoływanej DefaultAzureCredentialAzure.Identity z biblioteki klienta. DefaultAzureCredential obsługuje wiele metod uwierzytelniania i automatycznie określa, które powinny być używane w czasie wykonywania. Więcej informacji na temat tego podejścia można uzyskać w temacie DefaultAzureCredential overview (Omówienie domyślneAzureCredential).

Połączenie hostowaną aplikację platformy Azure do wielu usług platformy Azure

Masz za zadanie połączenie istniejącej aplikacji z wieloma usługami i bazami danych platformy Azure przy użyciu połączeń bez hasła. Aplikacja jest podstawowym interfejsem API sieci Web ASP.NET hostowanym w usłudze aplikacja systemu Azure Service, ale poniższe kroki dotyczą również innych środowisk hostingu platformy Azure, takich jak Azure Spring Apps, Virtual Machines, Container Apps i AKS.

Ten samouczek dotyczy następujących architektur, choć można go dostosować do wielu innych scenariuszy, a także poprzez minimalne zmiany konfiguracji.

Diagram showing the user assigned identity relationships.

W poniższych krokach pokazano, jak skonfigurować aplikację do używania tożsamości zarządzanej przypisanej przez system i lokalnego konta programistycznego w celu nawiązania połączenia z wieloma usługami platformy Azure.

Tworzenie tożsamości zarządzanej przypisanej przez system

  1. W witrynie Azure Portal przejdź do hostowanej aplikacji, którą chcesz połączyć z innymi usługami.

  2. Na stronie przeglądu usługi wybierz pozycję Tożsamość.

  3. Przełącz ustawienie Stan na Włączone , aby włączyć tożsamość zarządzaną przypisaną przez system dla usługi.

    Screenshot showing how to assign a system assigned managed identity.

Przypisywanie ról do tożsamości zarządzanej dla każdej połączonej usługi

  1. Przejdź do strony przeglądu konta magazynu, do którego chcesz udzielić dostępu do tożsamości.

  2. Wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) w obszarze nawigacji konta magazynu.

  3. Wybierz pozycję + Dodaj , a następnie dodaj przypisanie roli.

    Screenshot showing how to assign a system-assigned identity.

  4. W polu wyszukiwania Rola wyszukaj pozycję Współautor danych obiektu blob usługi Storage, który przyznaje uprawnienia do wykonywania operacji odczytu i zapisu na danych obiektów blob. Możesz przypisać dowolną rolę odpowiednią dla danego przypadku użycia. Wybierz współautora danych obiektu blob usługi Storage z listy, a następnie wybierz pozycję Dalej.

  5. Na ekranie Dodawanie przypisania roli dla opcji Przypisz dostęp do wybierz pozycję Tożsamość zarządzana. Następnie wybierz pozycję +Wybierz członków.

  6. W oknie wysuwaym wyszukaj utworzoną tożsamość zarządzaną, wprowadzając nazwę usługi app Service. Wybierz tożsamość przypisaną przez system, a następnie wybierz pozycję Wybierz , aby zamknąć menu wysuwane.

    Screenshot showing how to select a system-assigned identity.

  7. Wybierz pozycję Dalej kilka razy, dopóki nie będzie można wybrać pozycji Przejrzyj i przypisz , aby zakończyć przypisanie roli.

  8. Powtórz ten proces dla innych usług, z którymi chcesz nawiązać połączenie.

Zagadnienia dotyczące programowania lokalnego

Możesz również włączyć dostęp do zasobów platformy Azure na potrzeby programowania lokalnego, przypisując role do konta użytkownika w taki sam sposób, jak przypisano role do tożsamości zarządzanej.

  1. Po przypisaniu roli Współautor danych obiektu blob usługi Storage do tożsamości zarządzanej w obszarze Przypisz dostęp tym razem wybierz pozycję Użytkownik, grupa lub jednostka usługi. Wybierz pozycję + Wybierz członków , aby ponownie otworzyć menu wysuwane.

  2. Wyszukaj konto user@domain lub grupę zabezpieczeń Microsoft Entra, do której chcesz udzielić dostępu za pomocą adresu e-mail lub nazwy, a następnie wybierz je. Powinno to być to samo konto, za pomocą którego logujesz się do lokalnego narzędzia programistycznego, na przykład programu Visual Studio lub interfejsu wiersza polecenia platformy Azure.

Uwaga

Te role można również przypisać do grupy zabezpieczeń firmy Microsoft Entra, jeśli pracujesz nad zespołem z wieloma deweloperami. Następnie możesz umieścić dowolnego dewelopera w tej grupie, który potrzebuje dostępu do tworzenia aplikacji lokalnie.

Implementowanie kodu aplikacji

Wewnątrz projektu dodaj odwołanie do Azure.Identity pakietu NuGet. Ta biblioteka zawiera wszystkie jednostki niezbędne do zaimplementowania DefaultAzureCredentialprogramu . Możesz również dodać inne biblioteki platformy Azure, które są istotne dla aplikacji. W tym przykładzie Azure.Storage.Blobs pakiety i Azure.KeyVault.Keys są dodawane w celu nawiązania połączenia z usługą Blob Storage i usługą Key Vault.

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.KeyVault.Keys

W górnej części Program.cs pliku dodaj następujące instrukcje using:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Security.KeyVault.Keys;

Program.cs W pliku kodu projektu utwórz wystąpienia niezbędnych usług, z którymi aplikacja będzie się łączyć. W poniższych przykładach nawiąż połączenie z usługą Blob Storage i usługą Service Bus przy użyciu odpowiednich klas zestawu SDK.

var blobServiceClient = new BlobServiceClient(
    new Uri("https://<your-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential(credOptions));

var serviceBusClient = new ServiceBusClient("<your-namespace>", new DefaultAzureCredential());
var sender = serviceBusClient.CreateSender("producttracking");

Gdy ten kod aplikacji zostanie uruchomiony lokalnie, DefaultAzureCredential przeszuka łańcuch poświadczeń pod kątem pierwszych dostępnych poświadczeń. Jeśli wartość Managed_Identity_Client_ID ma wartość null lokalnie, automatycznie użyje poświadczeń z lokalnego interfejsu wiersza polecenia platformy Azure lub logowania programu Visual Studio. Więcej informacji na temat tego procesu można uzyskać w temacie Omówienie biblioteki tożsamości platformy Azure.

Po wdrożeniu aplikacji na platformie Azure DefaultAzureCredential automatycznie pobierze zmienną Managed_Identity_Client_ID ze środowiska usługi App Service. Ta wartość staje się dostępna, gdy tożsamość zarządzana jest skojarzona z aplikacją.

Ten ogólny proces gwarantuje, że aplikacja będzie mogła działać bezpiecznie lokalnie i na platformie Azure bez konieczności wprowadzania zmian w kodzie.

Połączenie wielu aplikacji przy użyciu wielu tożsamości zarządzanych

Mimo że aplikacje w poprzednim przykładzie wszystkie współużytkują te same wymagania dotyczące dostępu do usług, rzeczywiste środowiska są często bardziej szczegółowe. Rozważmy scenariusz, w którym wiele aplikacji łączy się z tymi samymi kontami magazynu, ale dwie aplikacje uzyskują również dostęp do różnych usług lub baz danych.

Diagram showing multiple user-assigned managed identities.

Aby skonfigurować tę konfigurację w kodzie, upewnij się, że aplikacja rejestruje oddzielne usługi w celu nawiązania połączenia z każdym kontem magazynu lub bazą danych. Pamiętaj, aby ściągnąć poprawne identyfikatory klienta tożsamości zarządzanej dla każdej usługi podczas konfigurowania programu DefaultAzureCredential. Poniższy przykład kodu konfiguruje następujące połączenia usługi:

  • Dwa połączenia z oddzielnymi kontami magazynu przy użyciu tożsamości zarządzanej przypisanej przez użytkownika
  • Połączenie z usługami Azure Cosmos DB i Azure SQL przy użyciu drugiej tożsamości zarządzanej przypisanej przez użytkownika
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage");

// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });

// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClient(
    new Uri("https://<contract-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });


// Get the second user-assigned managed identity ID to connect to shared databases
var clientIDdatabases = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases");

// Create an Azure Cosmos DB client
CosmosClient client = new CosmosClient(
    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDdatabases
    });

// Open a connection to Azure SQL using a managed identity
string ConnectionString1 = @"Server=<azure-sql-hostname>.database.windows.net; User Id=ObjectIdOfManagedIdentity; Authentication=Active Directory Default; Database=<database-name>";

using (SqlConnection conn = new SqlConnection(ConnectionString1))
{
    conn.Open();
}

Można również skojarzyć tożsamość zarządzaną przypisaną przez użytkownika, a także tożsamość zarządzaną przypisaną przez system do zasobu jednocześnie. Może to być przydatne w scenariuszach, w których wszystkie aplikacje wymagają dostępu do tych samych usług udostępnionych, ale jedna z aplikacji ma również bardzo specyficzną zależność od dodatkowej usługi. Użycie tożsamości przypisanej przez system gwarantuje również, że tożsamość powiązana z daną aplikacją zostanie usunięta po usunięciu aplikacji, co może pomóc w utrzymaniu czystego środowiska.

Diagram showing user-assigned and system-assigned managed identities.

Te typy scenariuszy zostały szczegółowo omówione w zaleceniach dotyczących najlepszych rozwiązań dotyczących tożsamości.

Następne kroki

W tym samouczku przedstawiono sposób migrowania aplikacji do połączeń bez hasła. Aby zapoznać się z pojęciami omówionymi w tym artykule, zapoznaj się z następującymi zasobami: