Konfigurieren kennwortloser Verbindungen zwischen mehreren Azure-Apps und -Diensten

Anwendungen erfordern häufig sichere Verbindungen zwischen mehreren Azure-Diensten gleichzeitig. Eine Azure App Service-Instanz eines Unternehmens kann beispielsweise eine Verbindung mit mehreren verschiedenen Speicherkonten, einer Azure SQL-Datenbankinstanz, einem Service Bus und mehr herstellen.

Verwaltete Identitäten sind die empfohlene Authentifizierungsoption für sichere, kennwortlose Verbindungen zwischen Azure-Ressourcen. Entwickler müssen nicht manuell viele verschiedene Geheimnisse für verwaltete Identitäten verfolgen und verwalten, da die meisten dieser Aufgaben intern von Azure erledigt werden. In diesem Tutorial erfahren Sie, wie Sie Verbindungen zwischen mehreren Diensten mithilfe von verwalteten Identitäten und der Azure Identity-Clientbibliothek verwalten können.

Vergleichen der Typen verwalteter Identitäten

Azure stellt die folgenden Typen von verwalteten Identitäten bereit:

  • Systemseitig zugewiesene verwaltete Identitäten werden direkt mit einer einzelnen Azure-Ressource verknüpft. Wenn Sie eine systemseitig zugewiesene verwaltete Identität für einen Dienst aktivieren, erstellt Azure eine verknüpfte Identität und verarbeitet administrative Aufgaben für diese Identität intern. Wenn die Azure-Ressource gelöscht wird, wird auch die Identität gelöscht.
  • Benutzerseitig zugewiesene verwaltete Identitäten sind unabhängige Identitäten, die von einem Administrator erstellt werden und einer oder mehreren Azure-Ressourcen zugeordnet werden können. Der Lebenszyklus der Identität ist unabhängig von diesen Ressourcen.

Weitere Informationen zu bewährten Methoden und zur Verwendung von systemseitig zugewiesenen verwalteten Identitäten im Vergleich zu benutzerseitig zugewiesenen Identitäten finden Sie in den Empfehlungen zu bewährten Methoden für Identitäten.

Explore DefaultAzureCredential

Verwaltete Identitäten werden im Allgemeinen in Ihrem Anwendungscode über eine Klasse namens DefaultAzureCredential implementiert, die von der Azure.Identity-Clientbibliothek aufgerufen wird. DefaultAzureCredential unterstützt mehrere Authentifizierungsmethoden und bestimmt automatisch, welche Methode zur Laufzeit verwendet werden soll. Weitere Informationen zu diesem Ansatz finden Sie in der Übersicht über „DefaultAzureCredential“.

Verbinden einer von Azure gehosteten App mit mehreren Azure-Diensten

Sie wurden damit beauftragt, eine vorhandene App mit mehreren Azure-Diensten und Datenbanken über kennwortlose Verbindungen zu verbinden. Die Anwendung ist eine auf Azure App Service gehostete ASP.NET Core Web-API. Die nachstehenden Schritte gelten jedoch auch für andere Azure-Hostingumgebungen, z. B. Azure Spring Apps, virtuelle Computer, Container-Apps und AKS.

Dieses Tutorial gilt für die folgenden Architekturen, kann jedoch durch minimale Konfigurationsänderungen auch an viele andere Szenarien angepasst werden.

Diagram showing the user assigned identity relationships.

Die folgenden Schritte veranschaulichen, wie Sie eine App so konfigurieren, dass eine systemseitig zugewiesene verwaltete Identität und Ihr lokales Entwicklungskonto verwendet werden, um eine Verbindung mit mehreren Azure-Diensten herzustellen.

Erstellen einer systemseitig zugewiesenen verwalteten Identität

  1. Navigieren Sie im Azure-Portal zu der gehosteten Anwendung, die Sie mit anderen Diensten verbinden möchten.

  2. Wählen Sie auf der Seite „Dienstübersicht“ die Option Identität aus.

  3. Legen Sie die Einstellung Status auf Ein fest, um eine systemseitig zugewiesene verwaltete Identität für den Dienst zu aktivieren.

    Screenshot showing how to assign a system assigned managed identity.

Zuweisen von Rollen zu verwalteten Identität für jeden verbundenen Dienst

  1. Navigieren Sie zur Übersichtsseite des Speicherkontos, auf das Ihre Identität Zugriff erhalten soll.

  2. Wählen Sie in der Speicherkontonavigation Zugriffssteuerung (IAM) aus.

  3. Wählen Sie Hinzufügen und dann Rollenzuweisung hinzufügen aus.

    Screenshot showing how to assign a system-assigned identity.

  4. Suchen Sie im Suchfeld Rolle nach Speicherblobdaten-Mitwirkender, der Berechtigungen zum Ausführen von Lese- und Schreibvorgängen für Blobdaten gewährt. Sie können eine beliebige Rolle zuweisen, die für Ihren Anwendungsfall geeignet ist. Wählen Sie Speicherblobdaten-Mitwirkender aus der Liste und dann Weiter aus.

  5. Wählen Sie auf dem Bildschirm Rollenzuweisung hinzufügen für die Option Zugriff zuweisen zu die Option Verwaltete Identität aus. Wählen Sie dann + Mitglieder auswählen aus.

  6. Suchen Sie im Flyout nach der verwalteten Identität, die Sie erstellt haben, indem Sie den Namen Ihres App-Diensts eingeben. Wählen Sie die systemseitig zugewiesene Identität aus, und wählen Sie dann Auswählen aus, um das Flyoutmenü zu schließen.

    Screenshot showing how to select a system-assigned identity.

  7. Wählen Sie mehrmals Weiter aus, bis Sie Überprüfen und zuweisen auswählen können, um die Rollenzuweisung abzuschließen.

  8. Wiederholen Sie diesen Vorgang für die anderen Dienste, mit denen Sie eine Verbindung herstellen möchten.

Überlegungen zur lokalen Entwicklung

Sie können auch den Zugriff auf Azure-Ressourcen für die lokale Entwicklung aktivieren, indem Sie einem Benutzerkonto auf die gleiche Weise Rollen zuweisen, wie Sie Ihrer verwalteten Identität Rollen zugewiesen haben.

  1. Nachdem Sie die Rolle Speicherblobdaten-Mitwirkender ihrer verwalteten Identität zugewiesen haben, wählen Sie unter Zugriff zuweisen zu dieses Mal Benutzer, Gruppe oder Dienstprinzipal aus. Wählen Sie + Mitglieder auswählen aus, um das Flyoutmenü erneut zu öffnen.

  2. Suchen Sie nach dem Konto user@domain oder der Microsoft Entra-Sicherheitsgruppe, dem bzw. der Sie per E-Mail-Adresse oder Namen Zugriff erteilen möchten, und wählen Sie das Konto bzw. die Sicherheitsgruppe aus. Dabei sollte es sich um dasselbe Konto handeln, mit dem Sie sich bei Ihrem lokalen Entwicklungstool anmelden, z. B. Visual Studio oder die Azure CLI.

Hinweis

Sie können diese Rollen auch einer Microsoft Entra-Sicherheitsgruppe zuweisen, wenn Sie mit mehreren Entwicklern in einem Team zusammenarbeiten. Sie können dann jeden Entwickler, der Zugriff benötigt, in diese Gruppe aufnehmen, um an der lokalen Entwicklung der App teilzunehmen.

Implementieren des Anwendungscodes

Fügen Sie innerhalb Ihres Projekts einen Verweis auf das NuGet-Paket Azure.Identity hinzu. Diese Bibliothek enthält alle erforderlichen Entitäten zur Implementierung von DefaultAzureCredential. Sie können auch alle anderen Azure-Bibliotheken hinzufügen, die für Ihre App relevant sind. In diesem Beispiel werden die Pakete Azure.Storage.Blobs und Azure.KeyVault.Keys hinzugefügt, um eine Verbindung mit Blob Storage und Key Vault herzustellen.

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

Fügen Sie am Anfang der Program.cs-Datei die folgenden using-Anweisungen hinzu:

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

Erstellen Sie in der Program.cs-Datei des Projektcodes Instanzen der erforderlichen Dienste, mit der Ihre App eine Verbindung herstellt. In den folgenden Beispielen wird mithilfe der entsprechenden SDK-Klassen eine Verbindung mit Blob Storage und Service Bus hergestellt.

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");

Wenn dieser Anwendungscode lokal ausgeführt wird, sucht DefaultAzureCredential in einer Anmeldeinformationskette die ersten verfügbaren Anmeldeinformationen. Wenn Managed_Identity_Client_ID lokal „Null“ ist, werden automatisch die Anmeldeinformationen Ihrer lokalen Azure CLI- oder Visual Studio-Anmeldung verwendet. Weitere Informationen zu diesem Prozess finden Sie in der Übersicht über die Azure Identity-Bibliothek.

Wenn die Anwendung in Azure bereitgestellt wird, ruft DefaultAzureCredential automatisch die Variable Managed_Identity_Client_ID aus der App-Dienstumgebung ab. Dieser Wert wird verfügbar, wenn eine verwaltete Identität Ihrer App zugeordnet wird.

Dieser Gesamtprozess stellt sicher, dass Ihre App lokal und in Azure sicher ausgeführt werden kann, ohne dass Codeänderungen erforderlich sind.

Verbinden mehrerer Apps mit mehreren verwalteten Identitäten

Obwohl die Apps im vorigen Beispiel alle die gleichen Anforderungen an den Dienstzugriff haben, sind reale Umgebungen oft vielschichtiger. Betrachten Sie ein Szenario, in dem mehrere Apps eine Verbindung mit den gleichen Speicherkonten herstellen, aber zwei der Apps auch auf verschiedene Dienste oder Datenbanken zugreifen.

Diagram showing multiple user-assigned managed identities.

Um dieses Setup in Ihrem Code zu konfigurieren, müssen Sie sicherstellen, dass Ihre Anwendung für jede Verbindung mit einem Speicherkonto oder einer Datenbank separate Dienste registriert. Stellen Sie sicher, dass Sie bei der Konfiguration von DefaultAzureCredential die richtigen Client-IDs der verwalteten Identität für jeden Dienst abrufen. Im folgenden Codebeispiel werden die folgenden Dienstverbindungen konfiguriert:

  • Zwei Verbindungen mit separaten Speicherkonten über eine gemeinsame benutzerseitig zugewiesene verwaltete Identität
  • Eine Verbindung mit Azure Cosmos DB- und Azure SQL-Diensten über eine zweite gemeinsame benutzerseitig zugewiesene verwaltete Identität
// 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();
}

Sie können einer Ressource auch gleichzeitig eine benutzerseitig zugewiesene verwaltete Identität und eine systemseitig zugewiesene verwaltete Identität zuordnen. Dies kann in Szenarien nützlich sein, in denen alle Apps Zugriff auf dieselben gemeinsam freigegebenen Dienste benötigen, aber eine der Apps hat auch eine sehr spezifische Abhängigkeit von einem zusätzlichen Dienst aufweist. Durch die Verwendung einer systemseitig zugewiesenen Identität wird außerdem sichergestellt, dass die mit der jeweiligen App verbundene Identität gelöscht wird, wenn die App gelöscht wird, was dazu beitragen kann, Ihre Umgebung sauber zu halten.

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

Diese Arten von Szenarien werden ausführlicher in den Empfehlungen zu bewährten Methoden für Identitäten untersucht.

Nächste Schritte

In diesem Tutorial haben Sie gelernt, wie Sie eine Anwendung zu kennwortlosen Verbindungen migrieren. Sie können die folgenden Ressourcen lesen, um die in diesem Artikel erläuterten Konzepte ausführlicher zu erkunden: