Tutorial: Verbindungsherstellung mit SQL-Datenbank über App Service (.NET) 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. Hierbei handelt es sich um eine vorgefertigte Lösung zum Schutz des Zugriffs auf Azure SQL-Datenbank und andere Azure-Dienste. 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 fügen Sie der in einem der folgenden Tutorials erstellten Beispiel-Web-App eine verwaltete Identität hinzu:

Danach stellt Ihre Beispiel-App ganz ohne Benutzername und Kennwort eine sichere Verbindung mit SQL-Datenbank her.

Architekturdiagramm für das Tutorialszenario.

Hinweis

Die in diesem Tutorial behandelten Schritte gelten für die folgenden Versionen:

  • .NET Framework 4.8 und höher
  • .NET 6.0 und höher

Anleitungen für Azure Database for MySQL oder Azure Database for PostgreSQL in anderen Sprachframeworks (Node.js, Python und Java) finden Sie unter Tutorial: Verbindungsherstellung mit Azure-Datenbanken über App Service ohne Geheimnisse mithilfe einer verwalteten Identität.

Sie lernen Folgendes:

  • Aktivieren von verwalteten Identitäten
  • Gewähren von SQL-Datenbank-Zugriff für die verwaltete Identität
  • Konfigurieren von Entity Framework für die Verwendung der Azure AD-Authentifizierung mit SQL-Datenbank
  • Herstellen einer Verbindung mit SQL-Datenbank über Visual Studio unter Verwendung der Azure AD-Authentifizierung

Hinweis

Die Azure AD-Authentifizierung unterscheidet sich von der integrierten Windows-Authentifizierung im lokalen Active Directory (AD DS). AD DS und Azure AD verwenden grundverschiedene Authentifizierungsprotokolle. Weitere Informationen finden Sie in der Dokumentation zu Azure AD Domain Services.

Sollten Sie über kein Azure-Abonnement verfügen, erstellen Sie zunächst ein kostenloses Azure-Konto.

Voraussetzungen

Dieser Artikel wird an der Stelle fortgesetzt, an der Sie eines der folgenden beiden Tutorials unterbrochen haben:

Absolvieren Sie zunächst eins der beiden Tutorials, sofern noch nicht geschehen. Alternativ können Sie die Schritte für Ihre eigene .NET-App mit SQL-Datenbank anpassen.

Vergewissern Sie sich zum Debuggen Ihrer App mit SQL-Datenbank als Back-End, dass Sie Clientverbindung von Ihrem Computer zugelassen haben. Falls nicht, fügen Sie die Client-IP mithilfe der Schritte unter the steps at IP-Firewallregeln für Azure SQL-Datenbank and SQL Data Warehouse hinzu.

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

  • Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Azure Cloud Shell-Schnellstart: Bash. Starten von Cloud Shell in einem neuen Fenster

  • 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 SQL-Datenbank, indem Sie einen Azure AD-Benutzer als Administrator des Servers zuweisen. 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)
    

    Tipp

    Wenn Sie eine Liste mit allen Benutzerprinzipalnamen in Azure AD anzeigen möchten, führen Sie az ad user list --query '[].userPrincipalName' aus.

  3. 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 server-name> durch den Servernamen (ohne das Suffix .database.windows.net).

    az sql server ad-admin create --resource-group myResourceGroup --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. Einrichten der Entwicklungsumgebung

  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.

3. Ändern des Projekts

Hinweis

Die Verwendung von Microsoft.Azure.Services.AppAuthentication wird für das neue Azure SDK nicht mehr empfohlen. Sie wird durch die neue Azure-Identitätsclientbibliothek ersetzt, die für .NET, Java, TypeScript und Python verfügbar ist und für alle Neuentwicklungen verwendet werden sollte. Informationen zur Migration zu Azure Identity finden Sie im Azure Identity.

Welche Schritte Sie für das Projekt ausführen, hängt davon ab, ob Sie Entity Framework (Standardeinstellung für ASP.NET) oder Entity Framework Core (Standardeinstellung für ASP.NET Core) verwenden.

  1. Öffnen Sie in Visual Studio die Paket-Manager-Konsole, fügen Sie das NuGet-Paket Azure.Identity hinzu, und aktualisieren Sie Entity Framework:

    Install-Package Azure.Identity
    Update-Package EntityFramework
    
  2. Fügen Sie im DbContext-Objekt (in Models/MyDbContext.cs) dem Standardkonstruktor folgenden Code hinzu.

    var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
    var credential = new Azure.Identity.DefaultAzureCredential();
    var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
    conn.AccessToken = token.Token;
    

    In diesem Code wird Azure.Identity.DefaultAzureCredential dazu verwendet, ein nutzbares Token für SQL-Datenbank aus Azure Active Directory abzurufen, das dann der Datenbankverbindung hinzugefügt wird. Sie können DefaultAzureCredential zwar anpassen, aber die Vielseitigkeit ist standardmäßig bereits hoch. Bei der Ausführung in App Service wird die systemseitig zugewiesene verwaltete Identität der App verwendet. Bei lokaler Ausführung kann ein Token mithilfe der angemeldeten Identität von Visual Studio, Visual Studio Code, Azure CLI und Azure PowerShell abgerufen werden.

  3. Suchen Sie in Web.config nach der Verbindungszeichenfolge mit der Bezeichnung , und ersetzen Sie den Wert connectionString durch "server=tcp:<server-name>.database.windows.net;database=<db-name>;". Ersetzen Sie die Platzhalter server-name> und > durch Ihren Servernamen bzw. durch Ihren Datenbanknamen. Diese Verbindungszeichenfolge wird vom Standardkonstruktor in Models/MyDbContext.cs verwendet.

    Das ist alles, was Sie benötigen, um eine Verbindung mit SQL-Datenbank herzustellen. Beim Debuggen in Visual Studio wird vom Code der Azure AD-Benutzer verwendet, den Sie unter 2. Einrichten der Entwicklungsumgebung konfiguriert haben. Sie richten die SQL-Datenbank später ein, um eine Verbindung von der verwalteten Identität ihrer App Service-App zuzulassen.

  4. Drücken Sie Ctrl+F5, um die App erneut auszuführen. Die gleiche CRUD-App in Ihrem Browser stellt nun unter Verwendung der Azure AD-Authentifizierung eine Direktverbindung mit der Azure SQL-Datenbank her. Dieses Setup ermöglicht das Ausführen von Datenbankmigrationen über Visual Studio.

4. Verwenden von Konnektivität mit verwalteter Identität

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

Hinweis

Die Anweisungen in diesem Abschnitt gelten zwar für eine systemseitig zugewiesene Identität, eine benutzerseitig zugewiesene Identität kann jedoch genauso einfach verwendet werden. Dazu müssen Sie az webapp identity assign command ändern, um die gewünschte benutzerseitig zugewiesene Identität zuzuweisen. Stellen Sie dann beim Erstellen des SQL-Benutzers sicher, dass Sie den Namen der benutzerseitig zugewiesenen Identitätsressource anstelle des Websitenamens verwenden.

Aktivieren einer verwalteten Identität für die App

Verwenden Sie den Befehl az webapp identity assign in Cloud Shell, um eine verwaltete Identität für Ihre Azure-App zu aktivieren. Ersetzen Sie im folgenden Befehl den Platzhalter app-name>.

az webapp identity assign --resource-group myResourceGroup --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.

Dies ist ein Beispiel für die Ausgabe:

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

Erteilen von Berechtigungen für eine verwaltete Identität

Hinweis

Sie können die Identität einer Azure AD-Gruppe hinzufügen und anschließend der Azure AD-Gruppe (und nicht der Identität) SQL-Datenbank-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 myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. Melden Sie sich in Cloud Shell mithilfe des Befehls „sqlcmd“ bei SQL-Datenbank an. Ersetzen Sie server-name> durch den Namen Ihres Servers, > durch den von Ihrer App verwendeten Datenbanknamen sowie < und > durch die Anmeldeinformationen Ihres Azure AD-Benutzers.

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. Führen Sie an der SQL-Eingabeaufforderung für die gewünschte Datenbank die folgenden Befehle aus, um der App die nötigen Mindestberechtigungen zu erteilen. Beispiel:

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

    identity-name> ist der Name der verwalteten Identität in Azure AD. Bei einer systemseitig zugewiesenen Identität wird immer der Namen Ihrer App Service-App verwendet. Bei einem Bereitstellungsslot lautet der Name der systemseitig zugewiesenen Identität App-Name/slots/<Slotname>. Wenn Sie Berechtigungen für eine Azure AD-Gruppe erteilen möchten, verwenden Sie stattdessen den Anzeigenamen der Gruppe (etwa myAzureSQLDBAccessGroup).

  3. Geben Sie EXIT ein, um zur Cloud Shell-Eingabeaufforderung zurückzukehren.

    Hinweis

    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 beim Konfigurieren der Berechtigungen für SQL-Datenbank einen Fehler machen und die Berechtigungen ändern möchten, 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.

    Hinweis

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

Ändern der Verbindungszeichenfolge

Zur Erinnerung: Die in Web.config oder appsettings.json vorgenommenen Änderungen funktionieren auch mit der verwalteten Identität. Sie müssen also lediglich die vorhandene Verbindungszeichenfolge in App Service entfernen, die von Visual Studio im Zuge der erstmaligen Bereitstellung Ihrer App erstellt wurde. Verwenden Sie den folgenden Befehl, und ersetzen Sie dabei den Platzhalter app-name> durch den Namen Ihrer App.

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5. Veröffentlichen der Änderungen

Nun müssen die Änderungen nur noch in Azure veröffentlicht werden.

  1. Wurden Sie vom Tutorial: Erstellen einer ASP.NET-App in Azure mit SQL-Datenbank weitergeleitet, veröffentlichen Sie Ihre Änderungen in Visual Studio. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt DotNetAppSqlDb, und wählen Sie Veröffentlichen aus.

    Veröffentlichen über den Projektmappen-Explorer

  2. Wählen Sie auf der Veröffentlichungsseite die Option Veröffentlichen aus.

    Wichtig

    Stellen Sie sicher, dass der App Service-Name nicht mit vorhandenen App-Registrierungen übereinstimmt. Dies führt zu Prinzipal-ID-Konflikten.

Wenn die neue Webseite Ihre Aufgabenliste anzeigt, stellt Ihre App unter Verwendung der verwalteten Identität eine Verbindung mit der Datenbank her.

Azure-App nach Code First-Migration

Die Aufgabenliste sollte sich nun wie gewohnt bearbeiten lassen.

Bereinigen von Ressourcen

In den vorherigen Schritten haben Sie Azure-Ressourcen in einer Ressourcengruppe erstellt. Wenn Sie diese Ressourcen in Zukunft nicht mehr benötigen, löschen Sie die Ressourcengruppe, indem Sie den folgenden Befehl in Cloud Shell ausführen:

az group delete --name myResourceGroup

Die Ausführung dieses Befehls kann eine Minute in Anspruch nehmen.

Nächste Schritte

Sie haben Folgendes gelernt:

  • Aktivieren von verwalteten Identitäten
  • Gewähren von SQL-Datenbank-Zugriff für die verwaltete Identität
  • Konfigurieren von Entity Framework für die Verwendung der Azure AD-Authentifizierung mit SQL-Datenbank
  • Herstellen einer Verbindung mit SQL-Datenbank über Visual Studio unter Verwendung der Azure AD-Authentifizierung