Migrowanie aplikacji do używania połączeń bez hasła z usługą Azure Cosmos DB for NoSQL

Żądania aplikacji do usługi Azure Cosmos DB for NoSQL muszą być uwierzytelnione. Chociaż istnieje wiele opcji uwierzytelniania w usłudze Azure Cosmos DB, należy określić priorytety połączeń bez hasła w aplikacjach, jeśli to możliwe. Tradycyjne metody uwierzytelniania, które używają parametry połączenia z hasłami lub kluczami tajnymi, tworzą zagrożenia bezpieczeństwa i komplikacje. Odwiedź centrum usług platformy Azure bez hasła, aby dowiedzieć się więcej o zaletach przechodzenia do połączeń bez hasła.

W poniższym samouczku wyjaśniono, jak przeprowadzić migrację istniejącej aplikacji w celu nawiązania połączenia z usługą Azure Cosmos DB for NoSQL przy użyciu połączeń bez hasła zamiast rozwiązania opartego na kluczach.

Konfigurowanie ról i użytkowników na potrzeby uwierzytelniania programowania lokalnego

Podczas opracowywania lokalnego przy użyciu uwierzytelniania bez hasła upewnij się, że konto użytkownika łączące się z usługą Cosmos DB ma przypisaną rolę z odpowiednimi uprawnieniami do wykonywania operacji na danych. Obecnie usługa Azure Cosmos DB for NoSQL nie obejmuje wbudowanych ról dla operacji na danych, ale możesz utworzyć własne przy użyciu interfejsu wiersza polecenia platformy Azure lub programu PowerShell.

Role składają się z kolekcji uprawnień lub akcji, które użytkownik może wykonywać, takich jak odczyt, zapis i usuwanie. Więcej informacji na temat konfigurowania kontroli dostępu opartej na rolach (RBAC) można uzyskać w dokumentacji konfiguracji zabezpieczeń usługi Cosmos DB.

Tworzenie roli niestandardowej

  1. Utwórz rolę przy użyciu az role definition create polecenia . Przekaż nazwę konta usługi Cosmos DB i grupę zasobów, a następnie treść kodu JSON definiującą rolę niestandardową. Poniższy przykład tworzy rolę o nazwie PasswordlessReadWrite z uprawnieniami do odczytu i zapisu elementów w kontenerach usługi Cosmos DB. Rola jest również ograniczona do poziomu konta przy użyciu polecenia /.

    az cosmosdb sql role definition create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --body '{
        "RoleName": "PasswordlessReadWrite",
        "Type": "CustomRole",
        "AssignableScopes": ["/"],
        "Permissions": [{
            "DataActions": [
                "Microsoft.DocumentDB/databaseAccounts/readMetadata",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
            ]
        }]
    }'
    
  2. Po zakończeniu działania polecenia skopiuj wartość identyfikatora name z pola i wklej ją gdzieś do późniejszego użycia.

  3. Przypisz rolę utworzoną do konta użytkownika lub jednostki usługi, która będzie łączyć się z usługą Cosmos DB. Podczas programowania lokalnego zazwyczaj będzie to twoje własne konto, które jest zalogowane do narzędzia programistycznego, takiego jak Program Visual Studio lub interfejs wiersza polecenia platformy Azure. Pobierz szczegóły konta przy użyciu az ad user polecenia .

    az ad user show --id "<your-email-address>"
    
  4. Skopiuj wartość id właściwości z wyników i wklej ją gdzieś do późniejszego użycia.

  5. Przypisz rolę niestandardową utworzoną do konta użytkownika przy użyciu az cosmosdb sql role assignment create polecenia i skopiowanych wcześniej identyfikatorów.

    az cosmosdb sql role assignment create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --scope "/" \
        --principal-id <your-user-id> \
        --role-definition-id <your-custom-role-id> 
    

Logowanie do platformy Azure lokalnie

W przypadku programowania lokalnego upewnij się, że uwierzytelniasz się przy użyciu tego samego konta Microsoft Entra, do którego przypisano rolę. Możesz uwierzytelnić się za pomocą popularnych narzędzi programistycznych, takich jak interfejs wiersza polecenia platformy Azure lub program Azure PowerShell. Narzędzia programistyczne, za pomocą których można uwierzytelniać się w różnych językach.

Zaloguj się do platformy Azure za pomocą interfejsu wiersza polecenia platformy Azure przy użyciu następującego polecenia:

az login

Migrowanie kodu aplikacji w celu korzystania z połączeń bez hasła

  1. Aby użyć DefaultAzureCredential w aplikacji .NET, zainstaluj Azure.Identity pakiet:

    dotnet add package Azure.Identity
    
  2. W górnej części pliku dodaj następujący kod:

    using Azure.Identity;
    
  3. Zidentyfikuj lokalizacje w kodzie, które tworzą obiekt w celu nawiązania połączenia z usługą CosmosClient Azure Cosmos DB. Zaktualizuj kod, aby był zgodny z poniższym przykładem.

    DefaultAzureCredential credential = new();
    
    using CosmosClient client = new(
        accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT"),
        tokenCredential: credential
    );
    

Lokalne uruchamianie aplikacji

Po wprowadzeniu tych zmian w kodzie uruchom aplikację lokalnie. Nowa konfiguracja powinna pobierać poświadczenia lokalne, takie jak interfejs wiersza polecenia platformy Azure, program Visual Studio lub IntelliJ. Role przypisane do lokalnego użytkownika deweloperskiego na platformie Azure umożliwiają aplikacji nawiązywanie połączenia z usługą platformy Azure lokalnie.

Konfigurowanie środowiska hostingu platformy Azure

Po skonfigurowaniu aplikacji do korzystania z połączeń bez hasła i uruchamianiu lokalnie ten sam kod może uwierzytelniać się w usługach platformy Azure po jej wdrożeniu na platformie Azure. W poniższych sekcjach opisano sposób konfigurowania wdrożonej aplikacji w celu nawiązania połączenia z usługą Azure Cosmos DB przy użyciu tożsamości zarządzanej.

Tworzenie tożsamości zarządzanej

Tożsamość zarządzaną przypisaną przez użytkownika można utworzyć przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure. Aplikacja używa tożsamości do uwierzytelniania w innych usługach.

  1. W górnej części witryny Azure Portal wyszukaj pozycję Tożsamości zarządzane. Wybierz wynik tożsamości zarządzanych.
  2. Wybierz pozycję + Utwórz w górnej części strony przeglądu tożsamości zarządzanych .
  3. Na karcie Podstawy wprowadź następujące wartości:
    • Subskrypcja: wybierz żądaną subskrypcję.
    • Grupa zasobów: wybierz żądaną grupę zasobów.
    • Region: wybierz region w pobliżu lokalizacji.
    • Nazwa: wprowadź rozpoznawalną nazwę tożsamości, taką jak MigrationIdentity.
  4. Wybierz pozycję Przejrzyj i utwórz w dolnej części strony.
  5. Po zakończeniu sprawdzania poprawności wybierz pozycję Utwórz. Platforma Azure tworzy nową tożsamość przypisaną przez użytkownika.

Po utworzeniu zasobu wybierz pozycję Przejdź do zasobu , aby wyświetlić szczegóły tożsamości zarządzanej.

A screenshot showing how to create a user assigned managed identity.

Kojarzenie tożsamości zarządzanej z aplikacją internetową

Musisz skonfigurować aplikację internetową tak, aby korzystała z utworzonej tożsamości zarządzanej. Przypisz tożsamość do aplikacji przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

Wykonaj następujące kroki w witrynie Azure Portal, aby skojarzyć tożsamość z aplikacją. Te same kroki dotyczą następujących usług platformy Azure:

  • Azure Spring Apps
  • Azure Container Apps
  • Maszyny wirtualne platformy Azure
  • Azure Kubernetes Service
  1. Przejdź do strony przeglądu aplikacji internetowej.

  2. Wybierz pozycję Tożsamość w obszarze nawigacji po lewej stronie.

  3. Na stronie Tożsamość przejdź do karty Przypisane przez użytkownika.

  4. Wybierz pozycję + Dodaj, aby otworzyć okno wysuwane Dodawanie tożsamości zarządzanej przypisanej przez użytkownika.

  5. Wybierz subskrypcję użytą wcześniej do utworzenia tożsamości.

  6. Wyszukaj pozycję MigrationIdentity według nazwy i wybierz ją z wyników wyszukiwania.

  7. Wybierz pozycję Dodaj , aby skojarzyć tożsamość z aplikacją.

    Screenshot showing how to create a user assigned identity.

Przypisywanie ról do tożsamości zarządzanej

Udziel uprawnień tożsamości zarządzanej, przypisując jej utworzoną rolę niestandardową, podobnie jak w przypadku lokalnego użytkownika dewelopera.

Aby przypisać rolę na poziomie zasobu przy użyciu interfejsu wiersza polecenia platformy Azure, należy najpierw pobrać identyfikator zasobu przy użyciu polecenia az cosmosdb show . Właściwości wyjściowe można filtrować przy użyciu parametru --query .

az cosmosdb show \
    --resource-group '<resource-group-name>' \
    --name '<cosmosdb-name>' \
    --query id

Skopiuj identyfikator wyjściowy z poprzedniego polecenia. Następnie możesz przypisać role przy użyciu polecenia az role assignment interfejsu wiersza polecenia platformy Azure.

az role assignment create \
    --assignee "<your-managed-identity-name>" \
    --role "PasswordlessReadWrite" \
    --scope "<cosmosdb-resource-id>"

Aktualizowanie kodu aplikacji

Należy skonfigurować kod aplikacji, aby wyszukać określoną tożsamość zarządzaną utworzoną podczas wdrażania na platformie Azure. W niektórych scenariuszach jawne ustawienie tożsamości zarządzanej aplikacji zapobiega również przypadkowemu wykryciu i użyciu innych tożsamości środowiska.

  1. Na stronie przeglądu tożsamości zarządzanej skopiuj wartość identyfikatora klienta do schowka.

  2. Zastosuj następujące zmiany specyficzne dla języka:

    DefaultAzureCredentialOptions Utwórz obiekt i przekaż go do DefaultAzureCredentialobiektu . Ustaw właściwość ManagedIdentityClientId na identyfikator klienta.

    DefaultAzureCredential credential = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = managedIdentityClientId
        });
    
  3. Ponownie wdróż kod na platformie Azure po wprowadzeniu tej zmiany w celu zastosowania aktualizacji konfiguracji.

Testowanie aplikacji

Po wdrożeniu zaktualizowanego kodu przejdź do hostowanej aplikacji w przeglądarce. Aplikacja powinna mieć możliwość pomyślnego nawiązania połączenia z usługą Cosmos DB. Należy pamiętać, że propagowanie przypisań ról za pośrednictwem środowiska platformy Azure może potrwać kilka minut. Aplikacja jest teraz skonfigurowana do uruchamiania zarówno lokalnie, jak i w środowisku produkcyjnym bez konieczności zarządzania wpisami tajnymi w samej aplikacji.

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: