Tutorial: Verbindungsherstellung mit Azure-Datenbanken über App Service ohne Geheimnisse mithilfe einer verwalteten Identität

App Service bietet einen hochgradig skalierbaren Webhostingdienst mit Self-Patching in Azure. Außerdem steht eine verwaltete Identität für Ihre App zur Verfügung, wobei es sich um eine vorgefertigte Lösung zum Schutz des Zugriffs auf Azure-Datenbank handelt, einschließlich:

Hinweis

Dieses Tutorial enthält keine Anleitungen für Azure Cosmos DB, die Azure Active Directory-Authentifizierung auf andere Weise unterstützt. Weitere Informationen finden Sie in der Azure Cosmos DB-Dokumentation, z. B. unter Verwenden von systemseitig zugewiesenen verwalteten Identitäten für den Zugriff auf Azure Cosmos DB-Daten.

Verwaltete Identitäten in App Service machen Ihre App frei von Geheimnissen (wie etwa Anmeldeinformationen in Verbindungszeichenfolgen) und verbessern so die Sicherheit Ihrer App. In diesem Tutorial wird gezeigt, wie Sie eine Verbindung mit den oben erwähnten Datenbanken aus App Service mithilfe verwalteter Identitäten herstellen.

Sie lernen Folgendes:

  • Konfigurieren eines Azure AD-Benutzers als Administrator für Ihre Azure-Datenbank.
  • Herstellen einer Verbindung mit Ihrer Datenbank als Azure AD-Benutzer.
  • Konfigurieren einer systemseitig oder benutzerseitig zugewiesenen verwalteten Identität für eine App Service-App.
  • Gewähren von Datenbankzugriff auf die verwaltete Identität.
  • Herstellen einer Verbindung mit der Azure-Datenbank aus Ihrem Code (.NET Framework 4.8, .NET 6, Node.js, Python, Java) mithilfe einer verwalteten Identität.
  • Herstellen einer Verbindung mit der Azure-Datenbank aus Ihrer Entwicklungsumgebung mithilfe des Azure AD-Benutzers.

Wenn Sie kein Azure-Abonnement haben, erstellen Sie ein kostenloses Azure-Konto, bevor Sie beginnen.

Voraussetzungen

  • Erstellen Sie eine App in App Service, basierend auf .NET, Node.js, Python oder Java.
  • Erstellen Sie einen Datenbankserver mit Azure SQL-Datenbank, Azure Database for MySQL oder Azure Database for PostgreSQL.
  • Sie sollten mit dem Standardkonnektivitätsmuster (mit Benutzername und Kennwort) vertraut und in der Lage sein, eine erfolgreiche Verbindung von Ihrer App Service-App mit Ihrer ausgewählten Datenbank herzustellen.

Bereiten Sie die Umgebung für die Azure CLI vor.

  • Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Schnellstart für Bash in Azure Cloud Shell.

  • Wenn Sie CLI-Referenzbefehle lieber lokal ausführen, installieren Sie die Azure CLI. Wenn Sie Windows oder macOS ausführen, sollten Sie die Azure CLI in einem Docker-Container ausführen. Weitere Informationen finden Sie unter Ausführen der Azure CLI in einem Docker-Container.

    • Wenn Sie eine lokale Installation verwenden, melden Sie sich mithilfe des Befehls az login bei der Azure CLI an. Führen Sie die in Ihrem Terminal angezeigten Schritte aus, um den Authentifizierungsprozess abzuschließen. Informationen zu anderen Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.

    • Installieren Sie die Azure CLI-Erweiterung beim ersten Einsatz, wenn Sie dazu aufgefordert werden. Weitere Informationen zu Erweiterungen finden Sie unter Verwenden von Erweiterungen mit der Azure CLI.

    • Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um das Upgrade auf die aktuelle Version durchzuführen.

1. Gewähren von Datenbankzugriff für Azure AD-Benutzer

Aktivieren Sie zunächst die Azure Active Directory-Authentifizierung für die Azure-Datenbank, indem Sie einen Azure AD-Benutzer als Administrator des Servers zuweisen. Für das Szenario im Tutorial verwenden Sie diesen Benutzer, um eine Verbindung mit Ihrer Azure-Datenbank aus der lokalen Entwicklungsumgebung herzustellen. Später richten Sie die verwaltete Identität für Ihre App Service-App ein, um eine Verbindung aus Azure heraus herzustellen.

Hinweis

Dieser Benutzer unterscheidet sich von dem Microsoft-Konto, das Sie bei der Registrierung für Ihr Azure-Abonnement verwendet haben. Es muss sich um einen Benutzer handeln, den Sie in Azure AD erstellt, importiert, synchronisiert oder eingeladen haben. Weitere Informationen zu zulässigen Azure AD-Benutzern finden Sie unter Funktionen und Einschränkungen von Azure AD.

  1. Enthält Ihr Azure AD-Mandant noch keinen Benutzer, erstellen Sie einen anhand der Schritte unter Hinzufügen oder Löschen von Benutzern in Azure Active Directory.

  2. Ermitteln Sie die Objekt-ID des Azure AD-Benutzers mithilfe von az ad user list, und ersetzen Sie den Platzhalter az ad user list. Das Ergebnis wird in einer Variablen gespeichert.

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].id --output tsv)
    
  1. Fügen Sie diesen Azure AD-Benutzer in Cloud Shell mithilfe des Befehls az sql server ad-admin create als Active Directory-Administrator hinzu. Ersetzen Sie im folgenden Befehl <group-name> und <server-name> durch Ihre eigenen Parameter.

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

    Weitere Informationen zum Hinzufügen eines Active Directory-Administrators finden Sie unter Bereitstellen eines Azure Active Directory-Administrators für Ihren Server.

2. Konfigurieren einer verwalteten Identität für die App

Als Nächstes konfigurieren Sie Ihre App Service-App so, dass sie beim Herstellen der Verbindung mit SQL-Datenbank eine verwaltete Identität verwendet.

  1. Aktivieren Sie mit dem Befehl az webapp identity assign in Cloud Shell eine verwaltete Identität für Ihre App Service-App. Ersetzen Sie im folgenden Befehl den Platzhalter app-name>.

    az webapp identity assign --resource-group <group-name> --name <app-name>
    

    Hinweis

    Wenn Sie eine verwaltete Identität für einen Bereitstellungsslot aktivieren möchten, fügen Sie hinzu, und verwenden Sie in slot-name> den Namen des Slots.

  2. Der Identität müssen Berechtigungen für den Zugriff auf die Datenbank gewährt werden. Melden Sie sich in Cloud Shell mit dem folgenden Befehl bei Ihrer Datenbank an. Ersetzen Sie <server-name> durch den Namen Ihres Servers, <database-name> durch den von Ihrer App verwendeten Datenbanknamen sowie <aad-user-name> und <aad-password> durch die Anmeldeinformationen Ihres Azure AD-Benutzers aus 1. Gewähren von Datenbankzugriff für Azure AD-Benutzer.

    sqlcmd -S <server-name>.database.windows.net -d <database-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  3. Führen Sie die folgenden Datenbankbefehle aus, um die Berechtigungen zu erteilen, die Ihre App benötigt. Beispiel:

    CREATE USER [<app-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<app-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<app-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<app-name>];
    GO
    

    Verwenden Sie für einen Bereitstellungsslot anstelle von <app-name><app-name>/slots/<slot-name>.

3. Ändern Ihres Codes

In diesem Abschnitt folgt die Verbindung mit der Azure-Datenbank in Ihrem Code dem DefaultAzureCredential-Muster für alle Sprachenstapel. DefaultAzureCredential ist flexibel genug, um sich sowohl an die Entwicklungsumgebung als auch an die Azure-Umgebung anzupassen. Bei der lokalen Ausführung kann der angemeldete Azure-Benutzer aus der Umgebung Ihrer Wahl (Visual Studio, Visual Studio Code, Azure CLI oder Azure PowerShell) abgerufen werden. Bei Ausführung in Azure wird die verwaltete Identität abgerufen. Auf diese Weise ist es möglich, sowohl zur Entwicklungszeit als auch in der Produktion eine Verbindung mit der Datenbank zu haben. Das Muster ist wie folgt:

  1. Instanziieren eines DefaultAzureCredential aus der Azure Identity-Clientbibliothek. Wenn Sie eine benutzerseitig zugewiesene Identität verwenden, geben Sie die Client-ID der Identität an.
  2. Abrufen eines Zugriffstokens für den Ressourcen-URI entsprechend dem Datenbanktyp.
    • Für Azure SQL-Datenbank: https://database.windows.net/.default
    • Für Azure Database for MySQL: https://ossrdbms-aad.database.windows.net/.default
    • Für Azure Database for PostgreSQL: https://ossrdbms-aad.database.windows.net/.default
  3. Hinzufügen des Tokens zu Ihrer Verbindungszeichenfolge.
  4. Öffnen Sie die Verbindung.

Für Azure Database for MySQL und Azure Database for PostgreSQL wird der Datenbankbenutzernamen, den Sie in 2. Konfigurieren einer verwalteten Identität für die App erstellt haben, auch in der Verbindungszeichenfolge benötigt.

  1. Öffnen Sie in Visual Studio die Paket-Manager-Konsole, und fügen Sie benötigten NuGet-Pakete hinzu:

    Install-Package Azure.Identity
    Install-Package System.Data.SqlClient
    
  2. Stellen Sie eine Verbindung mit der Azure-Datenbank her, indem Sie ein Zugriffstoken hinzufügen. Wenn Sie eine benutzerseitig zugewiesene Identität verwenden, stellen Sie sicher, dass Sie die Auskommentierung der entsprechenden Zeilen aufheben.

    // Uncomment one of the two lines depending on the identity type
    //var credential = new Azure.Identity.DefaultAzureCredential(); // system-assigned identity
    //var credential = new Azure.Identity.DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = '<client-id-of-user-assigned-identity>' }); // user-assigned identity
    
    // Get token for Azure SQL Database
    var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
    
    // Add the token to the SQL connection
    var connection = new System.Data.SqlClient.SqlConnection("Server=tcp:<server-name>.database.windows.net;Database=<database-name>;TrustServerCertificate=True");
    connection.AccessToken = token.Token;
    
    // Open the SQL connection
    connection.Open();
    

    Ein detaillierteres Tutorial finden Sie unter Tutorial: Verbindungsherstellung mit SQL-Datenbank über App Service (.NET) ohne Geheimnisse mithilfe einer verwalteten Identität.

4. Einrichten Ihrer Entwicklungsumgebung

In diesem Beispielcode wird DefaultAzureCredential dazu verwendet, ein nutzbares Token für Ihre Azure-Datenbank aus Azure Active Directory abzurufen, das dann der Datenbankverbindung hinzugefügt wird. Sie können DefaultAzureCredential zwar anpassen, doch es ist bereits standardmäßig sehr vielseitig. Es ruft ein Token vom angemeldeten Azure AD-Benutzer oder von einer verwalteten Identität ab, je nachdem, ob Sie es lokal in Ihrer Entwicklungsumgebung oder in App Service ausführen.

Ohne weitere Änderungen ist Ihr Code zur Ausführung in Azure bereit. Um Ihren Code lokal zu debuggen, benötigt Ihre Entwicklungsumgebung jedoch einen angemeldeten Azure AD-Benutzer. In diesem Schritt konfigurieren Sie die Umgebung Ihrer Wahl, indem Sie sich mit Ihrem Azure AD-Benutzer anmelden.

  1. Visual Studio für Windows ist in die Azure AD-Authentifizierung integriert. Fügen Sie in Visual Studio den Azure AD-Benutzer hinzu, um in Visual Studio entwickeln und debuggen zu können. Wählen Sie dazu über das Menü DateiKontoeinstellungen und anschließend Anmelden oder Hinzufügen aus.

  2. Wählen Sie über das Menü ExtrasOptionen und anschließend Azure Service Authentication (Azure-Dienstauthentifizierung)Kontoauswahl aus, um den Azure AD-Benutzer für die Azure-Dienstauthentifizierung festzulegen. Wählen Sie den Azure AD-Benutzer aus, den Sie hinzugefügt haben, und wählen Sie dann OK aus.

Weitere Informationen zum Einrichten der Entwicklungsumgebung für die Azure Active Directory-Authentifizierung finden Sie unter Azure Identity-Clientbibliothek für .NET.

Nun können Sie Ihre App mit der SQL-Datenbank als Back-End entwickeln und debuggen und dabei die Azure AD-Authentifizierung verwenden.

5. Testen und Veröffentlichen

  1. Führen Sie Ihren Code in Ihrer Entwicklungsumgebung aus. Ihr Code verwendet den angemeldeten Azure AD-Benutzer in Ihrer Umgebung, um eine Verbindung mit der Back-End-Datenbank herzustellen. Der Benutzer kann auf die Datenbank zugreifen, da er als Azure AD-Administrator für die Datenbank konfiguriert ist.

  2. Veröffentlichen Sie Ihren Code mithilfe der bevorzugten Veröffentlichungsmethode in Azure. In App Service verwendet Ihr Code die verwaltete Identität der App, um eine Verbindung mit der Back-End-Datenbank herzustellen.

Häufig gestellte Fragen

Unterstützt die verwaltete Identität SQL Server?

Azure Active Directory und verwaltete Identitäten werden für lokale SQL Server-Instanzen nicht unterstützt.

Ich erhalte den Fehler Login failed for user '<token-identified principal>'..

Die verwaltete Identität, für die Sie versuchen, ein Token anzufordern, ist nicht berechtigt, auf die Azure-Datenbank zuzugreifen.

Ich habe Änderungen an der App Service-Authentifizierung oder der zugehörigen App-Registrierung vorgenommen. Warum erhalte ich weiterhin das alte Token?

Die Back-End-Dienste verwalteter Identitäten verwalten darüber hinaus einen Tokencache, der das Token für eine Zielressource nur bei Ablauf aktualisiert. Wenn Sie die Konfiguration ändern, nachdem Sie versucht haben, mit Ihrer App ein Token abzurufen, erhalten Sie tatsächlich erst dann ein neues Token mit den aktualisierten Berechtigungen, wenn das zwischengespeicherte Token abläuft. Die beste Möglichkeit, um dies zu umgehen, besteht darin, Ihre Änderungen mit einem neuen InPrivate (Edge)/privatem (Safari)/Incognito (Chrome)-Fenster zu testen. Auf diese Weise können Sie sicher sein, dass Sie mit einer neuen authentifizierten Sitzung beginnen.

Gewusst wie: Hinzufügen der verwalteten Identität zu einer Azure AD-Gruppe

Sie können die Identität einer Azure AD-Gruppe hinzufügen und anschließend der Azure AD-Gruppe (und nicht der Identität) Zugriff erteilen. Mit den folgenden Befehlen wird beispielsweise die verwaltete Identität aus dem vorherigen Schritt zu einer neuen Gruppe namens myAzureSQLDBAccessGroup hinzugefügt:

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

Informationen zum Gewähren von Datenbankberechtigungen für eine Azure AD-Gruppe finden Sie in der Dokumentation für den jeweiligen Datenbanktyp.

Ich erhalte den Fehler mysql: unknown option '--enable-cleartext-plugin'.

Wenn Sie einen MariaDB-Client verwenden, ist die Option --enable-cleartext-plugin nicht erforderlich.

Ich erhalte den Fehler SSL connection is required. Please specify SSL options and retry.

Das Herstellen einer Verbindung mit der Azure-Datenbank erfordert zusätzliche Einstellungen und geht über den Umfang dieses Tutorials hinaus. Weitere Informationen dazu finden Sie unter den folgenden Links:

Konfigurieren von TSL-Verbindungen in Azure Database for PostgreSQL – EinzelserverKonfigurieren von SSL-Verbindungen in der Anwendung für eine sichere Verbindung mit Azure Database for MySQL

Nächste Schritte

Sie haben Folgendes gelernt:

  • Konfigurieren eines Azure AD-Benutzers als Administrator für Ihre Azure-Datenbank.
  • Herstellen einer Verbindung mit Ihrer Datenbank als Azure AD-Benutzer.
  • Konfigurieren einer systemseitig oder benutzerseitig zugewiesenen verwalteten Identität für eine App Service-App.
  • Gewähren von Datenbankzugriff auf die verwaltete Identität.
  • Herstellen einer Verbindung mit der Azure-Datenbank aus Ihrem Code (.NET Framework 4.8, .NET 6, Node.js, Python, Java) mithilfe einer verwalteten Identität.
  • Herstellen einer Verbindung mit der Azure-Datenbank aus Ihrer Entwicklungsumgebung mithilfe des Azure AD-Benutzers.