Condividi tramite


Integrare Database di Azure per PostgreSQL con Service Connector

Questa pagina illustra i metodi e i client di autenticazione supportati e il codice di esempio che è possibile usare per connettere Database di Azure per PostgreSQL ad altri servizi cloud tramite Connettore di servizi. È comunque possibile connettersi a Database di Azure per PostgreSQL in altri linguaggi di programmazione senza usare Connettore di servizi. Questa pagina mostra anche i nomi e i valori predefiniti delle variabili di ambiente (o configurazione spring boot) che si ottengono quando si crea la connessione al servizio.

Servizi di calcolo supportati

Connettore di servizi può essere usato per connettere i servizi di calcolo seguenti a Database di Azure per PostgreSQL:

  • Servizio app di Azure
  • App contenitore di Azure
  • Funzioni di Azure
  • Servizio Azure Kubernetes (AKS)
  • Azure Spring Apps

Tipi di autenticazione e di client supportati

La tabella seguente illustra le combinazioni di metodi di autenticazione e client supportati per la connessione del servizio di calcolo a Database di Azure per PostgreSQL tramite Connettore di servizi. Un valore "Sì" indica che la combinazione è supportata, mentre "No" indica che non è supportata.

Tipo client Identità gestita assegnata dal sistema Identità gestita assegnata dall'utente Stringa di segreto/connessione Entità servizio
.NET
Go (pg)
Java (JDBC)
Java - Spring Boot (JDBC)
Node.js (pg)
PHP (nativo)
Python (psycopg2)
Python-Django
Ruby (ruby-pg)
Nessuno

Questa tabella indica che tutte le combinazioni di tipi client e metodi di autenticazione nella tabella sono supportate. Tutti i tipi di client possono usare uno dei metodi di autenticazione per connettersi a Database di Azure per PostgreSQL tramite Connettore di servizi.

Nota

L'identità gestita assegnata dal sistema, l'identità gestita assegnata dall'utente e l'entità servizio sono supportate solo nell'interfaccia della riga di comando di Azure.

Nomi di variabili di ambiente predefiniti o proprietà dell'applicazione e codice di esempio

Per connettere i servizi di calcolo a Database di Azure per PostgreSQL, fare riferimento ai dettagli sulla connessione e al codice di esempio riportati nelle tabelle seguenti, in base al tipo di autenticazione e di client della connessione. Per altre informazioni sulle convenzioni di denominazione, vedere l'articolo Elementi interni di Service Connector.

Identità gestita assegnata dal sistema

Nome variabile di ambiente predefinito Descrizione Valore di esempio
AZURE_POSTGRESQL_CONNECTIONSTRING Stringa di connessione PostgreSQL .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Codice di esempio

Per connettersi a Database di Azure per PostgreSQL tramite un'identità gestita assegnata dal sistema, fare riferimento alla procedura e al codice seguenti.

Per .NET non è disponibile un plug-in o una libreria per supportare connessioni senza password. È possibile ottenere un token di accesso per l'identità gestita o l'entità servizio usando la libreria client come Azure.Identity. È quindi possibile usare il token di accesso come password per connettersi al database. Quando si usa il codice seguente, rimuovere il commento dalla parte del frammento di codice per il tipo di autenticazione che si vuole usare.

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

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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();
}

Successivamente, se si sono create tabelle e sequenze nel server flessibile PostgreSQL prima di usare Connettore di servizi, è necessario connettersi come proprietario e concedere l'autorizzazione alle <aad-username> create da Connettore di servizi. Il nome utente della stringa di connessione o della configurazione impostata da Connettore di servizi dovrebbe essere simile a aad_<connection name>. Se si usa il portale di Azure, selezionare il pulsante Espandi accanto alla colonna Service Type e ottenere il valore. Se si usa l'interfaccia della riga di comando di Azure, controllare configurations nell'output del comando dell'interfaccia della riga di comando.

Eseguire quindi la query per concedere l'autorizzazione

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>\";"

<owner-username> e <owner-password> sono i proprietari della tabella esistente che può concedere autorizzazioni ad altri utenti. <aad-username> è l'utente creato da Connettore di servizi. Sostituirlo con il valore effettivo.

Convalidare il risultato tramite il comando:

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

Identità gestita assegnata dall'utente

Nome variabile di ambiente predefinito Descrizione Valore di esempio
AZURE_POSTGRESQL_CLIENTID L’ID client <identity-client-ID>
AZURE_POSTGRESQL_CONNECTIONSTRING Stringa di connessione PostgreSQL .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Codice di esempio

Fare riferimento alla procedura e al codice seguenti per connettersi a Database di Azure per PostgreSQL tramite un'identità gestita assegnata dall'utente.

Per .NET non è disponibile un plug-in o una libreria per supportare connessioni senza password. È possibile ottenere un token di accesso per l'identità gestita o l'entità servizio usando la libreria client come Azure.Identity. È quindi possibile usare il token di accesso come password per connettersi al database. Quando si usa il codice seguente, rimuovere il commento dalla parte del frammento di codice per il tipo di autenticazione che si vuole usare.

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

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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();
}

Successivamente, se si sono create tabelle e sequenze nel server flessibile PostgreSQL prima di usare Connettore di servizi, è necessario connettersi come proprietario e concedere l'autorizzazione alle <aad-username> create da Connettore di servizi. Il nome utente della stringa di connessione o della configurazione impostata da Connettore di servizi dovrebbe essere simile a aad_<connection name>. Se si usa il portale di Azure, selezionare il pulsante Espandi accanto alla colonna Service Type e ottenere il valore. Se si usa l'interfaccia della riga di comando di Azure, controllare configurations nell'output del comando dell'interfaccia della riga di comando.

Eseguire quindi la query per concedere l'autorizzazione

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>\";"

<owner-username> e <owner-password> sono i proprietari della tabella esistente che può concedere autorizzazioni ad altri utenti. <aad-username> è l'utente creato da Connettore di servizi. Sostituirlo con il valore effettivo.

Convalidare il risultato tramite il comando:

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

Stringa di connessione

Avviso

Microsoft consiglia di usare il flusso di autenticazione più sicuro disponibile. Il flusso di autenticazione descritto in questa procedura richiede un livello di attendibilità molto elevato nell'applicazione e comporta rischi che non sono presenti in altri flussi. Si consiglia di usare questo flusso solo quando altri flussi più sicuri, come le identità gestite, non sono validi.

Nome variabile di ambiente predefinito Descrizione Valore di esempio
AZURE_POSTGRESQL_CONNECTIONSTRING Stringa di connessione PostgreSQL .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Codice di esempio

Fare riferimento alla procedura e al codice seguenti per connettersi a Database di Azure per PostgreSQL tramite una stringa di connessione.

  1. Installare le dipendenze. Seguire le indicazioni per installare Npgsql
  2. Nel codice, ottenere la stringa di connessione PostgreSQL dalle variabili di ambiente aggiunte dal servizio Connettore di servizi. Per impostare le configurazioni TSL per il server PostgreSQL, vedere la procedura seguente.
    using System;
    using Npgsql;
    
    string connectionString = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING");
    using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
    {
        connection.Open();
    }
    

Entità servizio

Nome variabile di ambiente predefinito Descrizione Valore di esempio
AZURE_POSTGRESQL_CLIENTID L’ID client <client-ID>
AZURE_POSTGRESQL_CLIENTSECRET Segreto client <client-secret>
AZURE_POSTGRESQL_TENANTID ID del tenant. <tenant-ID>
AZURE_POSTGRESQL_CONNECTIONSTRING Stringa di connessione PostgreSQL .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Codice di esempio

Per connettersi a Database di Azure per PostgreSQL tramite un'entità servizio, fare riferimento alla procedura e al codice seguenti.

Per .NET non è disponibile un plug-in o una libreria per supportare connessioni senza password. È possibile ottenere un token di accesso per l'identità gestita o l'entità servizio usando la libreria client come Azure.Identity. È quindi possibile usare il token di accesso come password per connettersi al database. Quando si usa il codice seguente, rimuovere il commento dalla parte del frammento di codice per il tipo di autenticazione che si vuole usare.

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

// Uncomment the following lines corresponding to the authentication type you want to use.
// 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();
}

Successivamente, se si sono create tabelle e sequenze nel server flessibile PostgreSQL prima di usare Connettore di servizi, è necessario connettersi come proprietario e concedere l'autorizzazione alle <aad-username> create da Connettore di servizi. Il nome utente della stringa di connessione o della configurazione impostata da Connettore di servizi dovrebbe essere simile a aad_<connection name>. Se si usa il portale di Azure, selezionare il pulsante Espandi accanto alla colonna Service Type e ottenere il valore. Se si usa l'interfaccia della riga di comando di Azure, controllare configurations nell'output del comando dell'interfaccia della riga di comando.

Eseguire quindi la query per concedere l'autorizzazione

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>\";"

<owner-username> e <owner-password> sono i proprietari della tabella esistente che può concedere autorizzazioni ad altri utenti. <aad-username> è l'utente creato da Connettore di servizi. Sostituirlo con il valore effettivo.

Convalidare il risultato tramite il comando:

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

Passaggi successivi

Per altre informazioni sul connettore di servizi seguire le esercitazioni riportate di seguito.