Herstellen einer Verbindung mit einer verwalteten Identität in Azure Database for PostgreSQL – Flexible Server

Sie können sowohl vom System zugewiesene als auch vom Benutzer zugewiesene verwaltete Identitäten verwenden, um sich bei einem Azure Database for PostgreSQL flexiblen Server zu authentifizieren. In diesem Artikel wird erläutert, wie Sie eine vom System zugewiesene verwaltete Identität für einen Azure virtuellen Computer (VM) verwenden, um auf einen Azure Database for PostgreSQL flexiblen Server zuzugreifen. Azure verwaltete Identitäten automatisch verwaltet und ermöglicht es Ihnen, sich bei Diensten zu authentifizieren, die Microsoft Entra Authentifizierung unterstützen, ohne Anmeldeinformationen in Ihren Code einfügen zu müssen.

Hier erfahren Sie, wie Sie:

  • Gewähren Sie Ihrem virtuellen Computer Zugriff auf einen Azure Database for PostgreSQL flexiblen Server.
  • Erstellen Sie einen Benutzer in der Datenbank, der die vom System zugewiesene Identität des virtuellen Computers darstellt.
  • Rufen Sie ein Zugriffstoken mithilfe der VM-Identität ab und verwenden Sie es, um einen Azure Database for PostgreSQL flexiblen Server abzufragen.
  • Implementieren Sie den Tokenabruf in einer C#-Beispielanwendung.

Voraussetzungen

Erstellen einer vom System zugewiesenen verwalteten Identität für Ihren virtuellen Computer

Verwenden Sie az vm identity assign mit dem Befehl identity assign, um die systemseitig zugewiesene Identität zu einer vorhandenen VM hinzuzufügen:

az vm identity assign -g myResourceGroup -n myVm

Rufen Sie die Anwendungs-ID für die vom System zugewiesene verwaltete Identität ab, die Sie in den nächsten Schritten benötigen:

# Get the client ID (application ID) of the system-assigned managed identity

az ad sp list --display-name vm-name --query [*].appId --out tsv

Erstellen Sie einen Azure Database for PostgreSQL-Benutzer für Ihre verwaltete Identität

Stellen Sie nun eine Verbindung als Microsoft Entra Administratorbenutzer mit Ihrer Azure Database for PostgreSQL flexiblen Serverdatenbank her, und führen Sie die folgenden SQL-Anweisungen aus. Ersetzen Sie den <identity_name> Namen der Ressourcen, für die Sie eine vom System zugewiesene verwaltete Identität erstellt haben.

Beachten Sie , dass pgaadauth_create_principal in der Postgres-Datenbank ausgeführt werden müssen.

select * from pgaadauth_create_principal('<identity_name>', false, false);

Erfolg sieht wie folgt aus:

    pgaadauth_create_principal
-----------------------------------
 Created role for "<identity_name>"
(1 row)

Weitere Informationen zum Verwalten von aktivierten Microsoft Entra-ID-Datenbankrollen finden Sie unter Verwalten von Microsoft Entra-Rollen in Azure Database for PostgreSQL.

Die verwaltete Identität hat jetzt Zugriff beim Authentifizieren mit dem Identitätsnamen als Rollennamen und dem Microsoft Entra-Token als Kennwort.

Hinweis

Wenn die verwaltete Identität ungültig ist, wird ein Fehler zurückgegeben: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Wenn ein Fehler wie "Keine Funktionsabgleiche..." angezeigt wird, stellen Sie sicher, dass Sie eine Verbindung mit der postgres Datenbank herstellen, nicht eine andere Datenbank, die Sie ebenfalls erstellt haben.

Abrufen des Zugriffstokens aus dem Azure-Instanzmetadatendienst

Ihre Anwendung kann jetzt ein Zugriffstoken aus dem Azure-Instanzmetadatendienst abrufen und für die Authentifizierung mit der Datenbank verwenden.

Das Abrufen dieses Tokens erfolgt durch Senden einer HTTP-Anforderung an http://169.254.169.254/metadata/identity/oauth2/token, wobei die folgenden Parameter übergeben werden:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (die Sie zuvor abgerufen haben)

Sie erhalten ein JSON-Ergebnis zurück, das ein access_token Feld enthält – dieser lange Textwert ist das Zugriffstoken für verwaltete Identität, das Sie beim Herstellen einer Verbindung mit der Datenbank als Kennwort verwenden sollten.

Zu Testzwecken können Sie die folgenden Befehle in Ihrer Shell ausführen.

Hinweis

Beachten Sie, dass Sie curl, jq und den psql-Client installiert haben.

# Retrieve the access token

export PGPASSWORD=`curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token`

# Connect to the database

psql -h SERVER --user USER DBNAME

Sie sind jetzt mit der Datenbank verbunden, die Sie zuvor konfiguriert haben.

Mit verwalteter Identität verbinden

In diesem Abschnitt wird gezeigt, wie Sie mithilfe der vom Benutzer zugewiesenen verwalteten Identität des virtuellen Computers ein Zugriffstoken abrufen und einen Azure Database for PostgreSQL flexiblen Server aufrufen. Azure Database for PostgreSQL unterstützt nativ die Microsoft Entra-Authentifizierung, sodass sie Zugriffstoken, die mit verwalteten Identitäten für Azure-Ressourcen abgerufen wurden, direkt akzeptieren kann. Beim Erstellen einer Verbindung mit einer Azure-Datenbank für PostgreSQL übergeben Sie das Zugriffstoken im Kennwortfeld.

Verbinden mit verwalteter Identität in Python

Ein Python-Codebeispiel finden Sie in der Schnellstartanleitung: Verwenden von Python zum Verbinden und Abfragen von Daten in Der Azure-Datenbank für PostgreSQL

Verbinden mithilfe von verwalteter Identität in Java

Ein Java-Codebeispiel finden Sie unter Schnellstart: Verwenden von Java und JDBC mit Azure Database for PostgreSQL.

Verbinden mithilfe von verwalteter Identität in C#

Hier ist ein .NET Codebeispiel, das eine Verbindung mit einem Azure Database for PostgreSQL flexiblen Server mithilfe eines Zugriffstokens öffnet. Dieser Code muss auf dem virtuellen Computer ausgeführt werden, um die vom System zugewiesene verwaltete Identität zu verwenden, um ein Zugriffstoken von Microsoft Entra ID abzurufen. Ersetzen Sie die Werte von HOST, USER (durch <identity_name>) und DATABASE.

using Azure.Identity;
using Npgsql;
using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Obtain an access token using the system-assigned managed identity
            var tokenCredential = new DefaultAzureCredential();
            var accessToken = tokenCredential.GetToken(
                new Azure.Core.TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" })
            );

            // Build the connection string
            string host = "your-server-name.postgres.database.azure.com"; // Replace with your flexible server's host
            string database = "your-database-name";                      // Replace with your database name
            string user = "<identity_name>";                             // Replace with your identity name (e.g., "myManagedIdentity")

            var connectionString = $"Host={host};Database={database};Username={user};Password={accessToken.Token};SSL Mode=Require;Trust Server Certificate=true";

            // Open a connection to the database
            using var connection = new NpgsqlConnection(connectionString);
            connection.Open();

            Console.WriteLine("Connection successful!");

            // Optional: Perform a simple query
            using var command = new NpgsqlCommand("SELECT version();", connection);
            using var reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine($"PostgreSQL version: {reader.GetString(0)}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

Füllen Sie die folgenden Platzhalter aus:

  • HOST: Ersetzen Sie your-server-name.postgres.database.azure.com durch den Hostnamen Ihres Servers.
  • USER: Ersetzen Sie <identity_name> durch den Namen Ihrer verwalteten Identität.
  • DATABASE: Ersetzen Sie your-database-name durch den Namen Ihres flexiblen Azure Database for PostgreSQL-Servers.
  • Microsoft Entra-Authentifizierung: Der Code verwendet die vom System zugewiesene verwaltete Identität der VM, um ein Zugriffstoken von Microsoft Entra ID abzurufen.

Wenn Sie diesen Befehl ausführen, erhalten Sie eine Ausgabe wie folgt:

Getting access token from Azure AD...
Opening connection using access token...

Connected!

Postgres version: PostgreSQL 11.11, compiled by Visual C++ build 1800, 64-bit