Share via


Tutorial: Erstellen einer kennwortlosen Verbindung mit einem Datenbankdienst über den Dienstconnector

Kennwortlose Verbindungen verwenden verwaltete Identitäten für den Zugriff auf Azure-Dienste. Bei diesem Ansatz müssen Sie Geheimnisse für verwaltete Identitäten nicht manuell nachverfolgen und verwalten. Diese Aufgaben werden intern sicher von Azure verarbeitet.

Der Dienstconnector ermöglicht verwaltete Identitäten in App-Hostingdiensten wie Azure Spring Apps, Azure App Service und Azure Container Apps. Außerdem konfiguriert der Dienstconnector auch Datenbankdienste wie Azure Database for PostgreSQL, Azure Database for MySQL und Azure SQL Datenbank, um verwaltete Identitäten zu akzeptieren.

In diesem Tutorial wird die Azure CLI verwendet, um folgende Aufgaben auszuführen:

  • Überprüfen Sie die anfängliche Umgebung mit der Azure CLI.
  • Erstellen Sie eine kennwortlose Verbindung mit Dienstconnector.
  • Verwenden Sie die vom Dienstconnector generierten Umgebungsvariablen oder Konfigurationen, um auf einen Datenbankdienst zuzugreifen.

Voraussetzungen

Erstellen Ihrer Umgebung

Konto

Anmelden mit der Azure CLI über az login. Wenn Sie Azure Cloud Shell verwenden oder bereits angemeldet sind, bestätigen Sie Ihr authentifiziertes Konto mit az account show.

Installieren der kennwortlosen Dienstconnector-Erweiterung

Installieren Sie die kennwortlose Dienstconnector-Erweiterung für die Azure CLI:

az extension add --name serviceconnector-passwordless --upgrade

Erstellen einer kennwortlosen Verbindung

Als Nächstes verwenden wir Azure App Service als Beispiel, um eine Verbindung mit verwalteter Identität zu erstellen.

Wenn Sie:

Hinweis

Wenn Sie das Azure-Portal verwenden, wechseln Sie zum Blatt Dienstconnector von Azure App Service, Azure Spring Apps oder Azure Container Apps, und wählen Sie Erstellen aus, um eine Verbindung zu erstellen. Das Azure-Portal erstellt den Befehl automatisch und löst die Befehlsausführung auf Cloud Shell aus.

Der folgende Azure CLI-Befehl verwendet einen --client-type-Parameter. Führen Sie az webapp connection create postgres-flexible -h aus, um die unterstützten Clienttypen abzurufen, und wählen Sie den aus, der Ihrer Anwendung entspricht.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type java

Azure Database for MySQL – Flexibler Server erfordert eine benutzerseitig zugewiesene verwaltete Identität, um die Microsoft Entra-Authentifizierung zu aktivieren. Weitere Informationen finden Sie unter Einrichten der Microsoft Entra-Authentifizierung für Azure Database for MySQL – Flexibler Server. Mit dem folgenden Befehl können Sie eine benutzerzugeordnete verwaltete Identität erstellen:

USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Wichtig

Nach dem Erstellen der benutzerseitig zugewiesenen verwalteten Identität bitten Sie Ihren globalen Administrator oder Administrator für privilegierte Rollen, die folgenden Berechtigungen für diese Identität zu erteilen:

  • User.Read.All
  • GroupMember.Read.All
  • Application.Read.All

Weitere Informationen finden Sie im Abschnitt Berechtigungen der Active Directory-Authentifizierung.

Verbinden Sie dann Ihre App mithilfe des Dienstconnectors mit einer MySQL-Datenbank mit einer systemseitig zugewiesenen verwalteten Identität.

Der folgende Azure CLI-Befehl verwendet einen --client-type-Parameter. Führen Sie az webapp connection create mysql-flexible -h aus, um die unterstützten Clienttypen abzurufen, und wählen Sie den aus, der Ihrer Anwendung entspricht.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

Der folgende Azure CLI-Befehl verwendet einen --client-type-Parameter. Führen Sie az webapp connection create sql -h aus, um die unterstützten Clienttypen abzurufen, und wählen Sie den aus, der Ihrer Anwendung entspricht.

az webapp connection create sql \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $SQL_HOST \
    --database $DATABASE_NAME \
    --user-identity client-id=XX subs-id=XX \
    --client-type dotnet

Mit diesem Dienstconnector-Befehl werden die folgenden Aufgaben im Hintergrund ausgeführt:

  • Aktivieren Sie die systemseitig zugewiesene verwaltete Identität, oder weisen Sie der App $APPSERVICE_NAME, die von Azure App Service/Azure Spring Apps/Azure Container Apps gehostet wird, eine Benutzeridentität zu.
  • Legen Sie den Microsoft Entra-Administrator auf den aktuellen angemeldeten Benutzer fest.
  • Fügen Sie einen Datenbankbenutzer für die systemseitig zugewiesene verwaltete Identität, die vom Benutzer zugewiesene verwaltete Identität oder den Dienstprinzipal hinzu. Gewähren Sie diesem Benutzer alle Berechtigungen für die Datenbank $DATABASE_NAME. Der Benutzername befindet sich in der Verbindungszeichenfolge in der vorherigen Befehlsausgabe.
  • Legen Sie Konfigurationen mit dem Namen AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING oder AZURE_SQL_CONNECTIONSTRING entsprechend dem Datenbanktyp auf die Azure-Ressource fest.
    • Für App Service werden die Konfigurationen auf dem Blatt App-Einstellungen festgelegt.
    • Für Spring Apps werden die Konfigurationen festgelegt, wenn die Anwendung gestartet wird.
    • Für Container Apps werden die Konfigurationen auf die Umgebungsvariablen festgelegt. Sie können alle Konfigurationen und ihre Werte auf dem Blatt Dienstconnector im Azure-Portal abrufen.

Herstellen einer Verbindung mit einer Datenbank mit Microsoft Entra-Authentifizierung

Nach dem Herstellen der Verbindung können Sie die Verbindungszeichenfolge in Ihrer Anwendung verwenden, um eine Verbindung mit der Datenbank mit Microsoft Entra-Authentifizierung herzustellen. Sie können beispielsweise die folgenden Lösungen verwenden, um eine Verbindung mit der Datenbank mit Microsoft Entra-Authentifizierung herzustellen.

Für .NET gibt es kein Plug-In und keine Bibliothek, die kennwortlose Verbindungen unterstützen. Sie können ein Zugriffstoken für die verwaltete Identität oder den Dienstprinzipal mithilfe einer Clientbibliothek wie Azure.Identity abrufen. Anschließend können Sie das Zugriffstoken als Kennwort verwenden, um eine Verbindung mit der Datenbank herzustellen. Wenn Sie den folgenden Code verwenden, heben Sie die Auskommentierung des Teils des Codeschnipsels für den Authentifizierungstyp auf, den Sie verwenden möchten.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// Acquire the access token. 
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
    new TokenRequestContext(scopes: new string[]
    {
        "https://ossrdbms-aad.database.windows.net/.default"
    }));

// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";

// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
    Console.WriteLine("Opening connection using access token...");
    connection.Open();
}

Wenn Sie vor der Verwendung des Dienstconnectors Tabellen und Sequenzen auf dem flexiblen PostgreSQL-Server erstellt haben, müssen Sie als Nächstes als der Besitzer eine Verbindung herstellen und dem vom Dienstconnector erstellten <aad-username> die Berechtigung erteilen. Der Benutzername aus der Verbindungszeichenfolge oder der vom Dienstconnector festgelegten Konfiguration sollte aad_<connection name> ähneln. Wenn Sie das Azure-Portal verwenden, wählen Sie die Schaltfläche „erweitern“ neben der Service Type-Spalte aus, und rufen Sie den Wert ab. Wenn Sie die Azure CLI verwenden, überprüfen Sie configurations in der CLI-Befehlsausgabe.

Führen Sie dann die Abfrage aus, um die Berechtigung zu erteilen.

az extension add --name rdbms-connect

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"

Der <owner-username> und das <owner-password> sind der Besitzer einer vorhandenen Tabelle, der anderen Personen Berechtigungen erteilen kann. <aad-username> ist der bzw. die Benutzer*in, der bzw. die vom Dienstconnector erstellt wurde. Ersetzen Sie sie durch den tatsächlichen Wert.

Überprüfen Sie das Ergebnis mit dem folgenden Befehl:

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

Für .NET gibt es kein Plug-In und keine Bibliothek, die kennwortlose Verbindungen unterstützen. Sie können ein Zugriffstoken für die verwaltete Identität oder den Dienstprinzipal mithilfe einer Clientbibliothek wie Azure.Identity abrufen. Anschließend können Sie das Zugriffstoken als Kennwort verwenden, um eine Verbindung mit der Datenbank herzustellen. Wenn Sie den folgenden Code verwenden, heben Sie die Auskommentierung des Teils des Codeschnipsels für den Authentifizierungstyp auf, den Sie verwenden möchten.

using Azure.Core;
using Azure.Identity;
using MySqlConnector;

// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();

// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
//     });

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

var tokenRequestContext = new TokenRequestContext(
    new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
    $"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";

using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();

// do something

Weitere Codebeispiele finden Sie unter Verbindungsherstellung mit Azure-Datenbanken über App Service ohne Geheimnisse mithilfe einer verwalteten Identität.

  1. Installieren Sie Abhängigkeiten.

    dotnet add package Microsoft.Data.SqlClient
    
  2. Rufen Sie die Azure SQL-Datenbank-Verbindungszeichenfolge aus der Umgebungsvariable ab, die vom Dienstconnector hinzugefügt wird.

    using Microsoft.Data.SqlClient;
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    Weitere Informationen finden Sie unter Verwenden der Active Directory mit verwalteter Identität-Authentifizierung.

Weitere Informationen finden Sie unter Startseite für die Clientprogrammierung in Microsoft SQL Server.

Bereitstellen der Anwendung in einem Azure-Hostingdienst

Stellen Sie schließlich Ihre Anwendung in einem Azure-Hostingdienst bereit. Dieser Quelldienst kann eine verwaltete Identität verwenden, um eine Verbindung mit der Zieldatenbank in Azure herzustellen.

Für Azure App Service können Sie den Anwendungscode über den az webapp deploy-Befehl bereitstellen. Weitere Informationen finden Sie unter Schnellstart: Bereitstellen einer ASP.NET-Web-App.

Anschließend können Sie das Protokoll überprüfen oder die Anwendung aufrufen, um festzustellen, ob eine Verbindung mit der Azure-Datenbank erfolgreich hergestellt werden kann.

Problembehandlung

Berechtigung

Wenn Fehler im Zusammenhang mit Berechtigungen auftreten, bestätigen Sie den angemeldeten Azure CLI-Benutzer mit dem Befehl az account show. Stellen Sie sicher, dass Sie sich mit dem richtigen Konto anmelden. Vergewissern Sie sich als Nächstes, dass Sie über die folgenden Berechtigungen verfügen, die möglicherweise erforderlich sind, um eine kennwortlose Verbindung mit dem Dienstconnector herzustellen.

Berechtigung Vorgang
Microsoft.DBforPostgreSQL/flexibleServers/read Erforderlich, um Informationen des Datenbankservers abzurufen
Microsoft.DBforPostgreSQL/flexibleServers/write Erforderlich, um die Microsoft Entra-Authentifizierung für den Datenbankserver zu aktivieren
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/write Erforderlich zum Erstellen einer Firewallregel für den Fall, dass die lokale IP-Adresse blockiert ist
Microsoft.DBforPostgreSQL/flexibleServers/firewallRules/delete Erforderlich, um die vom Service Connector erstellte Firewallregel zu rückgängig machen und so Sicherheitsrisiken zu vermeiden
Microsoft.DBforPostgreSQL/flexibleServers/administrators/read Erforderlich, um zu überprüfen, ob der Azure CLI-Anmeldebenutzer ein Microsoft Entra-Administrator für Datenbankserver ist
Microsoft.DBforPostgreSQL/flexibleServers/administrators/write Erforderlich, um den Azure CLI-Anmeldebenutzer als Azure AD-Administrator für den Datenbankserver hinzuzufügen
Berechtigung Vorgang
Microsoft.DBforMySQL/flexibleServers/read Erforderlich, um Informationen des Datenbankservers abzurufen
Microsoft.DBforMySQL/flexibleServers/write Erforderlich, um die angegebene vom Benutzer zugewiesene verwaltete Identität zum Datenbankserver hinzuzufügen
Microsoft.DBforMySQL/flexibleServers/firewallRules/write Erforderlich zum Erstellen einer Firewallregel für den Fall, dass die lokale IP-Adresse blockiert ist
Microsoft.DBforMySQL/flexibleServers/firewallRules/delete Erforderlich, um die vom Service Connector erstellte Firewallregel zu rückgängig machen und so Sicherheitsrisiken zu vermeiden
Microsoft.DBforMySQL/flexibleServers/administrators/read Erforderlich, um zu überprüfen, ob der Azure CLI-Anmeldebenutzer ein Microsoft Entra-Administrator für Datenbankserver ist
Microsoft.DBforMySQL/flexibleServers/administrators/write Erforderlich, um den Azure CLI-Anmeldebenutzer als Azure AD-Administrator für den Datenbankserver hinzuzufügen
Berechtigung Vorgang
Microsoft.Sql/servers/read Erforderlich, um Informationen des Datenbankservers abzurufen
Microsoft.Sql/servers/firewallRules/write Erforderlich zum Erstellen einer Firewallregel für den Fall, dass die lokale IP-Adresse blockiert ist
Microsoft.Sql/servers/firewallRules/delete Erforderlich, um die vom Service Connector erstellte Firewallregel zu rückgängig machen und so Sicherheitsrisiken zu vermeiden
Microsoft.Sql/servers/administrators/read Erforderlich, um zu überprüfen, ob der Azure CLI-Anmeldebenutzer ein Microsoft Entra-Administrator für Datenbankserver ist
Microsoft.Sql/servers/administrators/write Erforderlich, um den Azure CLI-Anmeldebenutzer als Azure AD-Administrator für den Datenbankserver hinzuzufügen

In einigen Fällen sind die Berechtigungen nicht erforderlich. Wenn der mit der Azure CLI authentifizierte Benutzer beispielsweise bereits ein Active Directory-Administrator auf SQL Server ist, benötigen Sie die Microsoft.Sql/servers/administrators/write-Berechtigung nicht.

Microsoft Entra ID

Wenn die Fehlermeldung ERROR: AADSTS530003: Your device is required to be managed to access this resource. angezeigt wird, bitten Sie Ihre IT-Abteilung um Hilfe beim Einbinden dieses Geräts in Microsoft Entra ID. Weitere Informationen finden Sie unter In Microsoft Entra eingebundene Geräte.

Der Dienstconnector muss auf Microsoft Entra ID zugreifen, um Informationen zu Ihrem Konto und der verwalteten Identität des Hostingdiensts abrufen zu können. Sie können den folgenden Befehl verwenden, um zu überprüfen, ob Ihr Gerät auf Microsoft Entra ID zugreifen kann:

az ad signed-in-user show

Wenn Sie sich nicht interaktiv anmelden, erhalten Sie möglicherweise auch den Fehler und Interactive authentication is needed. Melden Sie sich mit dem az login-Befehl an, um den Fehler zu beheben.

Netzwerkkonnektivität

Wenn sich Ihr Datenbankserver in Virtual Network befindet, stellen Sie sicher, dass Ihre Umgebung, in der der Azure CLI-Befehl ausgeführt wird, auf den Server im Virtual Network zugreifen kann.

Wenn sich Ihr Datenbankserver in Virtual Network befindet, stellen Sie sicher, dass Ihre Umgebung, in der der Azure CLI-Befehl ausgeführt wird, auf den Server im Virtual Network zugreifen kann.

Wenn Ihr Datenbankserver den öffentlichen Zugriff nicht erlaubt, stellen Sie sicher, dass Ihre Umgebung, in der der Azure CLI-Befehl ausgeführt wird, über den privaten Endpunkt auf den Server zugreifen kann.

Nächste Schritte

Weitere Informationen zum Dienstconnector und kennwortlosen Verbindungen finden Sie in den folgenden Ressourcen: