Share via


Connessione con identità gestita da Database di Azure per PostgreSQL - Server flessibile

SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile

È possibile usare identità gestite assegnate dal sistema e assegnate dall'utente per eseguire l'autenticazione a Database di Azure per PostgreSQL server flessibile. Questo articolo illustra come usare un'identità gestita assegnata dal sistema per una macchina virtuale di Azure per accedere a un'istanza del server flessibile Database di Azure per PostgreSQL. Le identità gestite vengono gestite automaticamente da Azure e consentono di eseguire l'autenticazione ai servizi che supportano l'autenticazione di Microsoft Entra senza dover inserire le credenziali nel codice.

Scopri come:

  • Concedere alla macchina virtuale l'accesso a un'istanza del server flessibile Database di Azure per PostgreSQL.
  • Creare un utente nel database che rappresenta l'identità assegnata dal sistema della macchina virtuale.
  • Ottenere un token di accesso usando l'identità della macchina virtuale e usarlo per eseguire query su un'istanza del server flessibile Database di Azure per PostgreSQL.
  • Implementare il recupero del token in un'applicazione di esempio C#.

Prerequisiti

  • Se non si ha familiarità con la funzionalità delle identità gestite per le risorse di Azure, vedere questa panoramica. Se non si ha un account Azure, registrarsi per ottenere un account gratuito prima di continuare.
  • Per eseguire le attività richieste di creazione delle risorse e gestione dei ruoli, l'account deve avere le autorizzazioni "Proprietario" nell'ambito appropriato (sottoscrizione o gruppo di risorse). Se è necessaria assistenza per un'assegnazione di ruolo, vedere Assegnare i ruoli di Azure per gestire l'accesso alle risorse della sottoscrizione di Azure.
  • È necessaria una macchina virtuale di Azure(ad esempio, che esegue Ubuntu Linux) che si vuole usare per accedere al database usando l'identità gestita
  • È necessaria un'istanza del server flessibile Database di Azure per PostgreSQL con l'autenticazione di Microsoft Entra configurata
  • Per seguire l'esempio C#, completare prima di tutto la guida su come Connessione con C#

Creare un'identità gestita assegnata dal sistema per la macchina virtuale

Usare az vm identity assign con il identity assign comando abilita l'identità assegnata dal sistema a una macchina virtuale esistente:

az vm identity assign -g myResourceGroup -n myVm

Recuperare l'ID applicazione per l'identità gestita assegnata dal sistema, necessaria nei passaggi successivi:

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

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

Creare un utente server flessibile Database di Azure per PostgreSQL per l'identità gestita

Connettersi ora come utente amministratore di Microsoft Entra al database del server flessibile Database di Azure per PostgreSQL ed eseguire le istruzioni SQL seguenti, sostituendo <identity_name> con il nome delle risorse per cui è stata creata un'identità gestita assegnata dal sistema:

Si noti che pgaadauth_create_principal deve essere eseguito nel database Postgres.

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

L'esito positivo è simile al seguente:

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

Per altre informazioni sulla gestione dei ruoli di database abilitati per Microsoft Entra ID, vedere come gestire microsoft Entra ID abilitato Database di Azure per PostgreSQL - Ruoli del server flessibile

L'identità gestita ha ora accesso quando si esegue l'autenticazione con il nome dell'identità come nome del ruolo e il token Microsoft Entra come password.

Nota

Se l'identità gestita non è valida, viene restituito un errore: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].

Nota

Se viene visualizzato un errore simile a "Nessuna corrispondenza di funzione...", assicurarsi di connettersi al postgres database, non di un database diverso creato.

Recuperare il token di accesso dal servizio metadati dell'istanza di Azure

L'applicazione può ora recuperare un token di accesso dal servizio metadati dell'istanza di Azure e usarlo per l'autenticazione con il database.

Il recupero di questo token viene eseguito effettuando una richiesta HTTP a http://169.254.169.254/metadata/identity/oauth2/token e passando i parametri seguenti:

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID (recuperato in precedenza)

Viene restituito un risultato JSON contenente un access_token campo. Questo valore di testo lungo è il token di accesso identità gestita da usare come password per la connessione al database.

A scopo di test, è possibile eseguire i comandi seguenti nella shell.

Nota

Si noti che è necessario che siano installati curl, jq e il client psql.

# 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

A questo punto si è connessi al database configurato in precedenza.

Connessione uso dell'identità gestita in C#

Questa sezione illustra come ottenere un token di accesso usando l'identità gestita assegnata dall'utente della macchina virtuale e usarla per chiamare Database di Azure per PostgreSQL server flessibile. Database di Azure per PostgreSQL server flessibile supporta in modo nativo l'autenticazione di Microsoft Entra, in modo che possa accettare direttamente i token di accesso ottenuti usando le identità gestite per le risorse di Azure. Quando si crea una connessione a Database di Azure per PostgreSQL server flessibile, si passa il token di accesso nel campo password.

Ecco un esempio di codice .NET per aprire una connessione a Database di Azure per PostgreSQL server flessibile usando un token di accesso. Questo codice deve essere eseguito nella macchina virtuale per usare l'identità gestita assegnata dal sistema per ottenere un token di accesso da Microsoft Entra ID. Sostituire i valori di HOST, U edizione Standard R (con <identity_name>) e DATABA edizione Standard.

using System;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Npgsql;
using Azure.Identity;

namespace Driver
{
    class Script
    {
        // Obtain connection string information from the portal for use in the following variables
        private static string Host = "HOST";
        private static string User = "USER";
        private static string Database = "DATABASE";

        static async Task Main(string[] args)
        {
            //
            // Get an access token for PostgreSQL.
            //
            Console.Out.WriteLine("Getting access token from Azure AD...");

            // Azure AD resource ID for Azure Database for PostgreSQL Flexible Server is https://ossrdbms-aad.database.windows.net/
            string accessToken = null;

            try
            {
                // Call managed identities for Azure resources endpoint.
                var sqlServerTokenProvider = new DefaultAzureCredential();
                accessToken = (await sqlServerTokenProvider.GetTokenAsync(
                    new Azure.Core.TokenRequestContext(scopes: new string[] { "https://ossrdbms-aad.database.windows.net/.default" }) { })).Token;

            }
            catch (Exception e)
            {
                Console.Out.WriteLine("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                System.Environment.Exit(1);
            }

            //
            // Open a connection to the PostgreSQL server using the access token.
            //
            string connString =
                String.Format(
                    "Server={0}; User Id={1}; Database={2}; Port={3}; Password={4}; SSLMode=Prefer",
                    Host,
                    User,
                    Database,
                    5432,
                    accessToken);

            using (var conn = new NpgsqlConnection(connString))
            {
                Console.Out.WriteLine("Opening connection using access token...");
                conn.Open();

                using (var command = new NpgsqlCommand("SELECT version()", conn))
                {

                    var reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        Console.WriteLine("\nConnected!\n\nPostgres version: {0}", reader.GetString(0));
                    }
                }
            }
        }
    }
}

Quando viene eseguito, questo comando restituisce un output simile al seguente:

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

Passaggi successivi