Freigeben über


Authentifizieren von von Azure gehosteten C++-Apps für Azure-Ressourcen mithilfe einer vom Benutzer zugewiesenen verwalteten Identität

Der empfohlene Ansatz zum Authentifizieren einer von Azure gehosteten App für andere Azure-Ressourcen besteht darin, eine verwaltete Identitätzu verwenden. Dieser Ansatz wird für die meisten Azure-Dienste unterstützt, einschließlich Apps in Azure App Service, Azure Container Apps und Azure Virtual Machines. Erfahren Sie mehr über verschiedene Authentifizierungstechniken und Ansätze auf der Authentifizierungsübersicht Seite. In den folgenden Abschnitten erfahren Sie:

  • Grundlegende Konzepte für verwaltete Identitäten
  • So erstellen Sie eine vom Benutzer zugewiesene verwaltete Identität für Ihre App
  • Zuweisen von Rollen zur vom Benutzer zugewiesenen verwalteten Identität
  • So authentifizieren Sie sich mithilfe der vom Benutzer zugewiesenen verwalteten Identität aus Ihrem App-Code

Grundlegende Konzepte für verwaltete Identitäten

Mit einer verwalteten Identität kann Ihre App sicher eine Verbindung mit anderen Azure-Ressourcen herstellen, ohne geheime Schlüssel oder andere geheime Anwendungsschlüssel zu verwenden. Intern verfolgt Azure die Identität und zu welchen Ressourcen es berechtigt ist, eine Verbindung herzustellen. Azure verwendet diese Informationen, um Automatisch Microsoft Entra-Token für die App abzurufen, damit sie eine Verbindung mit anderen Azure-Ressourcen herstellen kann.

Es gibt zwei Arten von verwalteten Identitäten, die Sie beim Konfigurieren Ihrer gehosteten App berücksichtigen sollten:

  • Vom System zugewiesene verwaltete Identitäten werden direkt auf einer Azure-Ressource aktiviert und sind an den Lebenszyklus gebunden. Wenn die Ressource gelöscht wird, löscht Azure die Identität automatisch für Sie. Vom System zugewiesene Identitäten bieten einen minimalistischen Ansatz für die Verwendung verwalteter Identitäten.
  • Vom Benutzer zugewiesene verwaltete Identitäten werden als eigenständige Azure-Ressourcen erstellt und bieten mehr Flexibilität und Funktionen. Sie eignen sich ideal für Lösungen mit mehreren Azure-Ressourcen, die dieselbe Identität und Berechtigungen gemeinsam nutzen müssen. Wenn beispielsweise mehrere virtuelle Computer auf denselben Satz von Azure-Ressourcen zugreifen müssen, bietet eine vom Benutzer zugewiesene verwaltete Identität wiederverwendbarkeit und optimierte Verwaltung.

Tipp

Erfahren Sie mehr über das Auswählen und Verwalten von vom System zugewiesenen und vom Benutzer zugewiesenen verwalteten Identitäten im Empfehlungsartikel zu bewährten Methoden für verwaltete Identitäten .

In den folgenden Abschnitten werden die Schritte zum Aktivieren und Verwenden einer vom Benutzer zugewiesenen verwalteten Identität für eine von Azure gehostete App beschrieben. Wenn Sie eine vom System zugewiesene verwaltete Identität verwenden müssen, besuchen Sie den Artikel mit vom System zugewiesenen verwalteten Identitäten , um weitere Informationen zu erhalten.

Erstellen einer benutzerseitig zugewiesenen verwalteten Identität

Vom Benutzer zugewiesene verwaltete Identitäten werden als eigenständige Ressourcen in Ihrem Azure-Abonnement mithilfe des Azure-Portals oder der Azure CLI erstellt. Azure CLI-Befehle können in der Azure Cloud Shell oder auf einer Workstation mit installierter Azure CLI ausgeführt werden.

  1. Geben Sie im Azure-Portal verwaltete Identitäten in die Hauptsuchleiste ein, und wählen Sie das entsprechende Ergebnis unter dem Abschnitt "Dienste " aus.

  2. Wählen Sie auf der Seite Verwaltete Identitäten die Option + Erstellen aus.

    Screenshot der Seite zum Verwalten von vom Benutzer zugewiesenen verwalteten Identitäten.

  3. Wählen Sie auf der Seite " Vom Benutzer zugewiesene verwaltete Identität erstellen " ein Abonnement, eine Ressourcengruppe und eine Region für die vom Benutzer zugewiesene verwaltete Identität aus, und geben Sie dann einen Namen an.

  4. Wählen Sie "Überprüfen + Erstellen" aus, um Ihre Eingaben zu überprüfen und zu validieren.

    Screenshot des Formulars zum Erstellen einer vom Benutzer zugewiesenen verwalteten Identität.

  5. Wählen Sie "Erstellen" aus, um die vom Benutzer zugewiesene verwaltete Identität zu erstellen.

  6. Nachdem die Identität erstellt wurde, wählen Sie "Zur Ressource wechseln" aus.

  7. Kopieren Sie auf der Seite "Übersicht" der neuen Identität den Client-ID-Wert , der später verwendet werden soll, wenn Sie den Anwendungscode konfigurieren.

Weisen Sie Ihrer App die verwaltete Identität zu

Eine vom Benutzer zugewiesene verwaltete Identität kann einer oder mehreren Azure-Ressourcen zugeordnet werden. Alle Ressourcen, die diese Identität nutzen, erhalten die Berechtigungen, die durch die Rollen der Identität vergeben werden.

  1. Navigieren Sie im Azure-Portal zu der Ressource, die Ihren App-Code hostt, z. B. eine Azure App Service- oder Azure-Container-App-Instanz.

  2. Blenden Sie auf der Seite Übersicht der Ressource Einstellungen ein, und wählen Sie im Navigationsbereich Identität.

  3. Wechseln Sie auf der Seite Identität zur Registerkarte Benutzerseitig zugewiesen.

  4. Wählen Sie + Hinzufügen aus, um den Bereich Benutzerzugewiesene verwaltete Identität hinzufügen zu öffnen.

  5. Verwenden Sie im Bereich "Vom Benutzer zugewiesene verwaltete Identität hinzufügen " das Dropdownmenü "Abonnement ", um die Suchergebnisse nach Ihren Identitäten zu filtern. Verwenden Sie das Suchfeld für vom Benutzer zugewiesene verwaltete Identitäten , um die vom Benutzer zugewiesene verwaltete Identität zu finden, die Sie für die Azure-Ressource aktiviert haben, die Ihre App hosten soll.

  6. Wählen Sie die Identität aus, und wählen Sie "Hinzufügen" am unteren Rand des Bereichs aus, um den Vorgang fortzusetzen.

    Screenshot, der zeigt, wie eine vom Benutzer zugewiesene verwaltete Identität einer App zugeordnet wird.

Zuweisen einer Rolle zur verwalteten Identität

Ermitteln Sie als Nächstes, welche Rollen Ihre App benötigt, und weisen Sie diese Rollen der verwalteten Identität zu. Sie können einer verwalteten Identität rollen in den folgenden Bereichen zuweisen:

  • Ressource: Die zugewiesenen Rollen gelten nur für diese bestimmte Ressource.
  • Ressourcengruppe: Die zugewiesenen Rollen gelten für alle Ressourcen, die in der Ressourcengruppe enthalten sind.
  • Abonnement-: Die zugewiesenen Rollen gelten für alle Im Abonnement enthaltenen Ressourcen.

Das folgende Beispiel zeigt, wie Rollen im Ressourcengruppenbereich zugewiesen werden, da viele Apps alle zugehörigen Azure-Ressourcen mithilfe einer einzelnen Ressourcengruppe verwalten.

  1. Navigieren Sie zur Übersichtsseite der Ressourcengruppe, die die App mit der vom Benutzer zugewiesenen verwalteten Identität enthält.

  2. Wählen Sie im Navigationsbereich links Zugriffssteuerung (IAM).

  3. Wählen Sie auf der Seite Zugriffssteuerung (IAM) im oberen Menü + Hinzufügen. Wählen Sie dann Rollenzuweisung hinzufügen, um zur Seite Rollenzuweisung hinzufügen zu navigieren.

    Screenshot, der zeigt, wie Sie auf die Seite

  4. Die Seite Rollenzuweisung hinzufügen stellt einen mehrstufigen Workflow zum Zuweisen von Rollen für Identitäten auf Registerkarten bereit. Verwenden Sie auf der ersten Registerkarte Rolle das Suchfeld oben, um die Rolle zu suchen, die Sie der Identität zuweisen möchten.

  5. Wählen Sie die Rolle in den Ergebnissen. Wählen Sie dann Weiter, um zur Registerkarte Mitglieder zu gelangen.

  6. Wählen Sie für die Option Zuweisen des Zugriffs auf die Option Verwaltete Identitätaus.

  7. Wählen Sie für die Option Mitglieder+ Mitglieder auswählen, um den Bereich Verwaltete Identitäten auswählen zu öffnen.

  8. Verwenden Sie im Bereich "Verwaltete Identitäten auswählen" die Dropdownlisten "Abonnement" und "Verwaltete Identität", um die Suchergebnisse für Ihre Identitäten zu filtern. Verwenden Sie das Suchfeld "Auswählen ", um die vom Benutzer zugewiesene verwaltete Identität zu suchen, die Sie für die Azure-Ressource aktiviert haben, die Ihre App hosten soll.

    Screenshot des Prozesses der verwalteten Identitätszuweisung.

  9. Wählen Sie die Identität und dann unten im Bereich Auswählen, um fortzufahren.

  10. Wählen Sie unten auf der Seite Überprüfen und zuweisen.

  11. Wählen Sie auf der letzten Registerkarte Überprüfen und zuweisen die Option Überprüfen und zuweisen, um den Workflow abzuschließen.

Authentifizieren von Azure-Diensten aus Ihrer App

Die Azure Identity-Bibliothek bietet verschiedene Anmeldeinformationen – Implementierungen von TokenCredential, die zur Unterstützung verschiedener Szenarien und Microsoft Entra-Authentifizierungsflüsse angepasst sind. Da verwaltete Identität bei der lokalen Ausführung nicht verfügbar ist, zeigen die folgenden Schritte, welche Anmeldeinformationen in welchem Szenario verwendet werden sollen:

  • Lokale Entwicklungsumgebung: Verwenden Sie während der lokalen Entwicklung nur eine Klasse namens DefaultAzureCredential für eine meinungsvermerkte, vorkonfigurierte Kette von Anmeldeinformationen. DefaultAzureCredential ermittelt Benutzeranmeldeinformationen aus Ihren lokalen Tools oder IDE, z. B. der Azure CLI oder Visual Studio. Außerdem bietet es Flexibilität und Komfort für Wiederholungen, Wartezeiten für Antworten und Unterstützung für mehrere Authentifizierungsoptionen. Besuchen Sie den Artikel Authentifizierung bei Azure-Diensten während der lokalen Entwicklung, um mehr zu erfahren.
  • In Azure gehostete Apps: Wenn Ihre App in Azure ausgeführt wird, verwenden Sie ManagedIdentityCredential , um die für Ihre App konfigurierte verwaltete Identität sicher zu ermitteln. Wenn Sie diesen genauen Anmeldedatentyp angeben, wird verhindert, dass andere verfügbare Anmeldedaten versehentlich verwendet werden.

Implementieren des Codes

  1. Fügen Sie das Azure-identity-cpp-Paket mithilfe von vcpkg zu Ihrer Anwendung hinzu.

    Navigieren Sie in einem Terminal Ihrer Wahl zum Anwendungsprojektverzeichnis, und führen Sie den folgenden Befehl aus:

    vcpkg add port azure-identity-cpp
    
  2. Fügen Sie Folgendes in Ihrer CMake-Datei hinzu:

    find_package(azure-identity-cpp CONFIG REQUIRED)
    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
    
  3. Auf Azure-Dienste wird über spezielle Clients aus den verschiedenen Azure SDK-Clientbibliotheken zugegriffen. Für jeden C++-Code, der einen Azure SDK-Client in Ihrer App instanziiert, müssen Sie:

    1. Fügen Sie die Kopfzeile ein azure/identity.hpp .
    2. Erstellen Sie eine instance von DefaultAzureCredential.
    3. Übergeben Sie die Instanz von DefaultAzureCredential an den Konstruktor des Azure SDK-Clients.
    4. Legen Sie die Umgebungsvariable AZURE_CLIENT_ID auf die Client-ID Ihrer vom Benutzer zugewiesenen verwalteten Identität fest.
    5. Setzen Sie die Umgebungsvariable AZURE_TOKEN_CREDENTIALS auf ManagedIdentityCredential, um sicherzustellen, dass DefaultAzureCredential die verwaltete Identitätsberechtigung verwendet. Diese Praxis macht die Authentifizierung vorhersehbarer und leichter zu debuggen, wenn sie auf Azure bereitgestellt wird. Weitere Informationen finden Sie unter Verwenden einer bestimmten Anmeldeinformationen.

    Ein Beispiel für diese Schritte ist im folgenden Codesegment mit einem Azure Storage Blob-Client dargestellt.

    #include <azure/identity.hpp>
    #include <azure/storage/blobs.hpp>
    #include <iostream>
    #include <memory>
    #include <cstdlib>
    
    int main() {
        try {
            // Set the AZURE_CLIENT_ID environment variable to your user-assigned managed identity client ID
            // This can be done in your deployment environment or in code (shown below for demonstration)
            // std::putenv("AZURE_CLIENT_ID=your-user-assigned-identity-client-id");
    
            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID environment variable
            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID and AZURE_TOKEN_CREDENTIALS environment variables
            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
    
            // Create a client for the specified storage account
            std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
    
            // Get a reference to a container
            std::string containerName = "sample-container";
            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
    
            // Get a reference to a blob
            std::string blobName = "sample-blob";
            auto blobClient = containerClient.GetBlobClient(blobName);
    
            // TODO: perform some action with the blob client
            // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
    
            std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
    
        } catch (const std::exception& ex) {
            std::cout << "Exception: " << ex.what() << std::endl;
            return 1;
        }
    
        return 0;
    }
    

Wie im Übersichtsartikel zur Azure SDK für C++-Authentifizierung erläutert, DefaultAzureCredential werden mehrere Authentifizierungsmethoden unterstützt und die Authentifizierungsmethode bestimmt, die zur Laufzeit verwendet wird. Der Vorteil dieses Ansatzes besteht darin, dass Ihre App unterschiedliche Authentifizierungsmethoden in verschiedenen Umgebungen verwenden kann, ohne umgebungsspezifischen Code zu implementieren. Wenn der vorangehende Code während der lokalen Entwicklung auf Ihrer Arbeitsstation ausgeführt wird, verwendet DefaultAzureCredential entweder einen App-Dienstprinzipal, der durch Umgebungseinstellungen bestimmt wird, oder Anmeldeinformationen von Entwicklertools, um sich bei anderen Azure-Ressourcen zu authentifizieren. Daher kann derselbe Code verwendet werden, um Ihre App bei Azure-Ressourcen sowohl während der lokalen Entwicklung als auch bei der Bereitstellung in Azure zu authentifizieren.

Von Bedeutung

DefaultAzureCredential vereinfacht die Authentifizierung beim Entwickeln von Anwendungen, die für Azure bereitgestellt werden, indem Anmeldeinformationen in Azure-Hostingumgebungen und Anmeldeinformationen kombiniert werden, die in der lokalen Entwicklung verwendet werden. In der Produktion ist es besser, einen bestimmten Anmeldeinformationstyp zu verwenden, damit die Authentifizierung vorhersehbarer und einfacher zu debuggen ist.

Eine Alternative zu DefaultAzureCredential besteht darin, ManagedIdentityCredential zu verwenden. Die Schritte für die Verwendung ManagedIdentityCredential sind identisch mit der Verwendung des DefaultAzureCredential Typs.

Ein Beispiel für diese Schritte ist im folgenden Codesegment mit einem Azure Storage Blob-Client dargestellt.

#include <azure/identity.hpp>
#include <azure/storage/blobs.hpp>
#include <iostream>
#include <memory>

int main() {
    try {
        // Create a user-assigned managed identity credential with the client ID
        Azure::Identity::ManagedIdentityCredentialOptions options;
        options.ClientId = "abcd1234-..."; // Replace with your user-assigned managed identity client ID
        auto credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>(options);
        
        // Create a client for the specified storage account
        std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
        Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
        
        // Get a reference to a container
        std::string containerName = "sample-container";
        auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
        
        // Get a reference to a blob
        std::string blobName = "sample-blob";
        auto blobClient = containerClient.GetBlobClient(blobName);
        
        // TODO: perform some action with the blob client
        // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
        
        std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
        
    } catch (const std::exception& ex) {
        std::cout << "Exception: " << ex.what() << std::endl;
        return 1;
    }
    
    return 0;
}