Tutorial: Schützen der Azure SQL-Datenbank-Verbindung von App Service mittels 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.

Hinweis

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

  • .NET Framework 4.7.2 und höher
  • .NET Core 2.2 und höher

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.

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

Voraussetzungen

Dieser Artikel fährt dort fort, wo Sie hier aufgehört haben: Tutorial: Erstellen einer ASP.NET-App in Azure mit SQL-Datenbank oder Tutorial: Erstellen einer ASP.NET Core- und SQL-Datenbank-App in Azure App Service. 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.

    Starten von Cloud Shell in einem neuen Fenster

  • Wenn Sie möchten, können Sie auch die Azure CLI installieren, um CLI-Verweisbefehle auszuführen.

    • 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. Weitere Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.

    • Installieren Sie die Azure CLI-Erweiterungen bei der ersten Verwendung, 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.

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

Aktivieren Sie zunächst die Azure AD-Authentifizierung für SQL-Datenbank, indem Sie einen Azure AD-Benutzer als Active Directory-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.

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.

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

azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].objectId --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.

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 Namen des SQL-Datenbank-Servers (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.

Einrichten von Visual Studio

Windows-Client

Visual Studio für Windows ist in die Azure AD-Authentifizierung integriert. Fügen Sie in Visual Studio Ihren Azure AD-Benutzer hinzu, um in Visual Studio entwickeln und debuggen zu können. Wählen Sie dazu über das Menü Datei > Kontoeinstellungen aus, und klicken Sie auf Konto hinzufügen.

Wählen Sie über das Menü Extras > Optionen 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 klicken Sie auf OK.

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

macOS-Client

Visual Studio für Mac ist nicht in die Azure AD-Authentifizierung integriert. Die Bibliothek Microsoft.Azure.Services.AppAuthentication, die Sie später verwenden werden, kann jedoch Token von der Azure CLI verwenden. Um die Entwicklung und das Debuggen in Visual Studio zu ermöglichen, müssen Sie zunächst die Azure CLI auf dem lokalen Computer installieren.

Wenn die Azure CLI auf dem lokalen Computer installiert ist, führen Sie den folgenden Befehl aus, um sich mit Ihrem Azure AD-Benutzerkonto bei der Azure CLI anzumelden:

az login --allow-no-subscriptions

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

Ändern Ihres Projekts

Die Schritte für Ihr Projekt hängen davon ab, ob es sich um ein ASP.NET-Projekt oder ein ASP.NET Core-Projekt handelt.

Ändern des ASP.NET-Projekts

Öffnen Sie in Visual Studio die Paket-Manager-Konsole, und fügen Sie das NuGet-Paket Microsoft.Azure.Services.AppAuthentication hinzu:

Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.4.0

Nehmen Sie in Web.config nacheinander folgende Änderungen vor:

  • Fügen Sie in <configSections> die folgende Abschnittsdeklaration ein:

    <section name="SqlAuthenticationProviders" type="System.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    
  • (Die Deklaration muss nach dem schließenden Tag </configSections> eingefügt werden.) Fügen Sie anschließend den folgenden XML-Code für <SqlAuthenticationProviders> hinzu:

    <SqlAuthenticationProviders>
      <providers>
        <add name="Active Directory Interactive" type="Microsoft.Azure.Services.AppAuthentication.SqlAppAuthenticationProvider, Microsoft.Azure.Services.AppAuthentication" />
      </providers>
    </SqlAuthenticationProviders>
    
  • Suchen Sie nach der Verbindungszeichenfolge MyDbConnection, und ersetzen Sie den Wert connectionString durch "server=tcp:<server-name>.database.windows.net;database=<db-name>;UID=AnyString;Authentication=Active Directory Interactive". Ersetzen Sie die Platzhalter <server-name> und <db-name> durch Ihren Servernamen bzw. durch Ihren Datenbanknamen.

Hinweis

Der von Ihnen eben registrierte SQL-Authentifizierungsanbieter (SqlAuthenticationProvider) basiert auf der zuvor installierten AppAuthentication-Bibliothek. Standardmäßig wird eine systemseitig zugewiesene Identität verwendet. Um eine benutzerseitig zugewiesene Identität zu nutzen, müssen Sie eine zusätzliche Konfiguration bereitstellen. Lesen Sie die Informationen zur Unterstützung der Verbindungszeichenfolge für die AppAuthentication-Bibliothek.

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

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.

Ändern des ASP.NET Core-Projekts

Öffnen Sie in Visual Studio die Paket-Manager-Konsole, und fügen Sie das NuGet-Paket Microsoft.Azure.Services.AppAuthentication hinzu:

Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.4.0

Unter Tutorial: Erstellen einer ASP.NET Core- und SQL-Datenbank-App in Azure App Service wird die Verbindungszeichenfolge MyDbConnection überhaupt nicht verwendet, weil die lokale Entwicklungsumgebung eine Sqlite-Datenbankdatei und die Azure-Produktionsumgebung eine Verbindungszeichenfolge aus App Service nutzt. Bei der Active Directory-Authentifizierung müssen beide Umgebungen die gleiche Verbindungszeichenfolge verwenden. Ersetzen Sie in appsettings.json den Wert der Verbindungszeichenfolge MyDbConnection durch Folgendes:

"Server=tcp:<server-name>.database.windows.net,1433;Database=<database-name>;"

Als Nächstes stellen Sie den Entity Framework-Datenbankkontext mit dem Zugriffstoken für SQL-Datenbank bereit. Fügen Sie in Data\MyDatabaseContext.cs den folgenden Code innerhalb der geschweiften Klammern des leeren Konstruktors MyDatabaseContext (DbContextOptions<MyDatabaseContext> options) hinzu:

var connection = (SqlConnection)Database.GetDbConnection();
connection.AccessToken = (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;

Hinweis

Zur Vereinfachung und besseren Übersichtlichkeit wird synchroner Democode verwendet.

Das ist alles, was Sie benötigen, um eine Verbindung mit SQL-Datenbank herzustellen. Beim Debuggen in Visual Studio verwendet Ihr Code den Azure AD-Benutzer, den Sie unter Einrichten von Visual Studio konfiguriert haben. Sie richten die SQL-Datenbank später ein, um eine Verbindung von der verwalteten Identität ihrer App Service-App zuzulassen. Die AzureServiceTokenProvider-Klasse speichert das Token im Arbeitsspeicher zwischen und ruft es kurz vor dem Ablaufdatum von Azure AD ab. Sie benötigen keinen benutzerdefinierten Code, um das Token zu aktualisieren.

Tipp

Wenn der von Ihnen konfigurierte Azure AD-Benutzer Zugriff auf mehrere Mandanten hat, rufen Sie GetAccessTokenAsync("https://database.windows.net/", tenantid) mit der gewünschten Mandanten-ID auf, um das geeignete Zugriffstoken abzurufen.

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.

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>

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

Melden Sie sich in Cloud Shell mithilfe des Befehls „sqlcmd“ bei SQL-Datenbank an. Ersetzen Sie <server-name> durch den Namen Ihres Servers, <db-name> durch den von Ihrer App verwendeten Datenbanknamen sowie <aad-user-name> und <aad-password> 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

Führen Sie an der SQL-Eingabeaufforderung für die gewünschte Datenbank die folgenden Befehle aus, um der App die nötigen Berechtigungen 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. Wird die Identität vom System zugewiesen, ist der Name immer mit dem Namen Ihrer App Service-App identisch. Wenn Sie Berechtigungen für eine Azure AD-Gruppe erteilen möchten, verwenden Sie stattdessen den Anzeigenamen der Gruppe (etwa myAzureSQLDBAccessGroup).

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

AAD wird für lokale SQL Server-Instanzen nicht unterstützt. Dazu zählen auch MSIs.

Ä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

Veröffentlichen der Änderungen

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

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

Klicken Sie auf der Veröffentlichungsseite auf Veröffentlichen.

Wichtig

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

Wurden Sie vom Tutorial: Erstellen einer ASP.NET Core- und SQL-Datenbank-App in Azure App Service weitergeleitet, veröffentlichen Sie Ihre Änderungen mithilfe von Git mit den folgenden Befehlen:

git commit -am "configure managed identity"
git push azure main

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

Fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie Ihrer Web-App einen benutzerdefinierten DNS-Namen zuordnen.