Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


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, usługą Service Bus 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 zarządzanych przypisanych przez system i przypisanych przez użytkownika w zaleceniach dotyczących najlepszych rozwiązań dotyczących tożsamości zarządzanych.

Eksplorowanie domyślneAzureCredential

Tożsamości zarządzane są najczęściej implementowane w kodzie aplikacji za pośrednictwem klasy wywoływanej DefaultAzureCredential z biblioteki klienta tożsamości platformy Azure. DefaultAzureCredential obsługuje wiele mechanizmów uwierzytelniania i automatycznie określa, które powinny być używane w czasie wykonywania. Dowiedz się więcej o DefaultAzureCredential następujących ekosystemach:

Łączenie aplikacji hostowanej na platformie Azure z wieloma usługami platformy Azure

Załóżmy, że twoim zadaniem jest połączenie istniejącej aplikacji z wieloma usługami i bazami danych platformy Azure przy użyciu połączeń bez hasła. Aplikacja jest ASP.NET Core internetowy interfejs API hostowany 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 przedstawiający relacje tożsamości przypisanej przez użytkownika.

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.

    Zrzut ekranu przedstawiający sposób przypisywania tożsamości zarządzanej przypisanej przez system.

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.

    Zrzut ekranu przedstawiający sposób lokalizowania sekcji witryny Azure Portal na potrzeby przypisywania roli do tożsamości zarządzanej przypisanej przez system.

  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.

    Zrzut ekranu przedstawiający sposób przypisywania roli do tożsamości zarządzanej przypisanej przez system w witrynie Azure Portal.

  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

Możesz również przypisać te role 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

  1. W projekcie zainstaluj Azure.Identity pakiet. Ta biblioteka udostępnia program DefaultAzureCredential. 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.Messaging.ServiceBus są dodawane do łączenia się odpowiednio z usługami Blob Storage i Service Bus.

    .NET CLI
    dotnet add package Azure.Identity
    dotnet add package Azure.Messaging.ServiceBus
    dotnet add package Azure.Storage.Blobs
    
  2. Utwórz wystąpienie klientów usługi dla usług platformy Azure, z którymi aplikacja musi się połączyć. Poniższy przykładowy kod współdziała z usługą Blob Storage i usługą Service Bus przy użyciu odpowiednich klientów usługi.

    C#
    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    using Azure.Storage.Blobs;
    
    // Create DefaultAzureCredential instance that uses system-assigned managed identity
    // in the underlying ManagedIdentityCredential.
    DefaultAzureCredential credential = new();
    
    BlobServiceClient blobServiceClient = new(
        new Uri("https://<your-storage-account>.blob.core.windows.net"),
        credential);
    
    ServiceBusClient serviceBusClient = new("<your-namespace>", credential);
    ServiceBusSender sender = serviceBusClient.CreateSender("producttracking");
    

Gdy ten kod zostanie uruchomiony lokalnie, DefaultAzureCredential przeszukuje jego łańcuch poświadczeń pod kątem pierwszych dostępnych poświadczeń. Jeśli zmienna Managed_Identity_Client_ID środowiskowa ma wartość null lokalnie, zostanie użyte poświadczenie odpowiadające lokalnie zainstalowanemu narzędziu deweloperskiemu. Na przykład interfejs wiersza polecenia platformy Azure lub program Visual Studio. Aby dowiedzieć się więcej na temat tego procesu, zobacz sekcję Eksplorowanie domyślneAzureCredential.

Po wdrożeniu aplikacji na platformie Azure DefaultAzureCredential automatycznie pobiera 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.

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

Mimo że aplikacje w poprzednim przykładzie współużytkują te same wymagania dotyczące dostępu do usług, środowiska rzeczywiste są często bardziej zniuansowane. 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 przedstawiający wiele tożsamości zarządzanych przypisanych przez użytkownika.

Aby skonfigurować tę konfigurację w kodzie, upewnij się, że aplikacja rejestruje oddzielnych klientów usługi w celu nawiązania połączenia z każdym kontem magazynu lub bazą danych. W przypadku DefaultAzureCredentialkonfigurowania programu należy odwołać się do prawidłowych identyfikatorów klienta tożsamości zarządzanej dla każdej usługi. Następujące przykłady kodu umożliwiają skonfigurowanie tych połączeń usługi platformy Azure:

  • 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. Ta tożsamość zarządzana jest udostępniana, gdy sterownik klienta usługi Azure SQL go umożliwia. Aby uzyskać więcej informacji, zobacz komentarze kodu.
  1. W projekcie zainstaluj wymagane pakiety. Biblioteka tożsamości platformy Azure udostępnia element DefaultAzureCredential.

    .NET CLI
    dotnet add package Azure.Identity
    dotnet add package Azure.Storage.Blobs
    dotnet add package Microsoft.Azure.Cosmos
    dotnet add package Microsoft.Data.SqlClient
    
  2. Dodaj następujący kod:

    C#
    using Azure.Core;
    using Azure.Identity;
    using Azure.Storage.Blobs;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Data.SqlClient;
    
    string clientIdStorage =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialStorage = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdStorage,
        });
    
    // First Blob Storage client
    BlobServiceClient blobServiceClient1 = new(
        new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    // Second Blob Storage client
    BlobServiceClient blobServiceClient2 = new(
        new Uri("https://<contract-storage-account>.blob.core.windows.net"),
        credentialStorage);
    
    string clientIdDatabases =
        Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases")!;
    
    // Create a DefaultAzureCredential instance that configures the underlying
    // ManagedIdentityCredential to use a user-assigned managed identity.
    DefaultAzureCredential credentialDatabases = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = clientIdDatabases,
        });
    
    // Create an Azure Cosmos DB client
    CosmosClient cosmosClient = new(
        Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
        credentialDatabases);
    
    // Open a connection to Azure SQL
    string connectionString =
        $"Server=<azure-sql-hostname>.database.windows.net;User Id={clientIdDatabases};Authentication=Active Directory Default;Database=<database-name>";
    
    using (SqlConnection connection = new(connectionString)
    {
        AccessTokenCallback = async (authParams, cancellationToken) =>
        {
            const string defaultScopeSuffix = "/.default";
            string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
                ? authParams.Resource
                : $"{authParams.Resource}{defaultScopeSuffix}";
            AccessToken token = await credentialDatabases.GetTokenAsync(
                new TokenRequestContext([scope]),
                cancellationToken);
    
            return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
        }
    })
    {
        connection.Open();
    }
    

Można również skojarzyć tożsamość zarządzaną przypisaną przez użytkownika i 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ż określoną zależność od dodatkowej usługi. Użycie tożsamości zarządzanej 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 przedstawiający tożsamości zarządzane przypisane przez użytkownika i przypisane przez system.

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

Następne kroki

W tym samouczku przedstawiono sposób migrowania aplikacji do połączeń bez hasła. Przeczytaj następujące zasoby, aby dokładniej zapoznać się z pojęciami omówionymi w tym artykule: