Freigeben über


Herstellen einer Verbindung mit verwalteter Identität mit Azure-Datenbank für PostgreSQL

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

Folgendes wird vermittelt:

  • Gewähren Sie Ihrem virtuellen Computer Zugriff auf eine Azure-Datenbank für eine flexible Serverinstanz von PostgreSQL.
  • 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 eine Azure-Datenbank für flexible Serverinstanz von PostgreSQL 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 with the identity assign command enables the system-assigned identity to an existing VM:

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 einer Azure-Datenbank für PostgreSQL-Benutzer für Ihre verwaltete Identität

Stellen Sie nun eine Verbindung als Microsoft Entra-Administratorbenutzer mit Ihrer flexiblen Azure-Datenbank für PostgreSQL her, und führen Sie die folgenden SQL-Anweisungen aus, und <identity_name> ersetzen Sie durch den 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.

Dieser Tokenabruf erfolgt durch Eine HTTP Anforderung und http://169.254.169.254/metadata/identity/oauth2/token Übergabe der folgenden Parameter:

  • 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, jqund der psql Client installiert ist.

# 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.

Herstellen einer Verbindung mit verwalteter Identität

In diesem Abschnitt wird gezeigt, wie Sie ein Zugriffstoken mithilfe der vom Benutzer zugewiesenen verwalteten Identität des virtuellen Computers abrufen und diese verwenden, um eine Azure-Datenbank für flexible Serverinstanz von PostgreSQL aufzurufen. 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 mit verwalteter Identität in Java

Ein Java-Codebeispiel finden Sie in der Quickstart: Verwenden von Java und JDBC mit Azure Database für PostgreSQL

Verbinden mit verwalteter Identität in C#

Nachfolgend finden Sie ein .NET-Codebeispiel zum Öffnen einer Verbindung mit einer Azure-Datenbank für flexible Serverinstanz von PostgreSQL mithilfe eines Zugriffstokens. 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}");
        }
    }
}

Sie müssen die folgenden Platzhalter ausfüllen:

  • HOST: Ersetzen Sie your-server-name.postgres.database.azure.com durch den Hostnamen Ihrer Instanz.
  • USER: Ersetzen Sie <identity_name> durch den Namen Ihrer verwalteten Identität.
  • DATABASE: Ersetzen Sie ihren Datenbanknamen durch den Namen Ihrer Azure-Datenbank für Die PostgreSQL-Instanz.
  • Microsoft Entra-Authentifizierung: Der Code verwendet die vom System zugewiesene verwaltete Identität der VM, um ein Zugriffstoken von Microsoft Entra ID abzurufen.

Wenn dieser Befehl ausgeführt wird, gibt dieser Befehl eine Ausgabe wie folgt aus:

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