PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ottieni token di accesso per la connessione a PostgreSQL in Funzioni di Azure

Se desideri connettere il database Postgres con l'autenticazione di Azure AD nella funzione di Azure, possiamo Azure Managed Identity per eseguire l'autenticazione di Azure AD, quindi ottenere il token di accesso di Azure AD e connettere il database.

I passaggi dettagliati sono i seguenti

  1. Abilita Azure MSI dall'app per le funzioni di Azure

  2. Ottieni l'ID cliente dell'MSI

az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
  1. Configura l'amministratore di Azure AD nel database Postgres

  2. Usare l'amministratore di Azure AD per connettere il database. (Uso PgAdmin per connettermi)

SET aad_validate_oids_in_tenant = off;
CREATE ROLE <userName> WITH LOGIN PASSWORD '<the appid of the MSI>' IN ROLE azure_ad_user;
  1. Configura il firewall del server Postgres. Aggiungere gli indirizzi IP in uscita dell'app per le funzioni di Azure nel firewall. Informazioni su come ottenere gli indirizzi IP in uscita dell'app per le funzioni di Azure e configurare il firewall del server Postgres, fare riferimento a qui e qui

  2. Se abiliti SSL, scarica il certificato SSL tramite il link

  3. Funzione. (Uso .net core per scrivere l'esempio)

un. sdk

 <PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="1.5.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.8" />
    <PackageReference Include="Npgsql" Version="4.1.3.1" />

b. aggiungi sopra il certificato SSL nel progetto. Ad esempio, creo una cartella cert nel mio progetto e salva il certificato nella cartella

c. codice


        [FunctionName("Http")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log, ExecutionContext context)
        {

            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://ossrdbms-aad.database.windows.net");
         
            string Host = "test05.postgres.database.azure.com";
            string User = "[email protected]";
            string Database = "postgres";
            string connString =
                String.Format(
                    "Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Require",
                    Host,
                    User,
                    Database,
                    5432,
                    accessToken);
            string result = string.Empty;
            using (var conn = new NpgsqlConnection(connString))
            {
                ProvideClientCertificatesCallback provideClientCertificates = clientCerts =>
                {
                    string clientCertPath = context.FunctionAppDirectory + "\\cert\\BaltimoreCyberTrustRoot.crt.pem";
                    var cert = new X509Certificate2(clientCertPath);
                    clientCerts.Add(cert);
                };
                conn.ProvideClientCertificatesCallback += provideClientCertificates;
                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));
                        result = reader.GetString(0);
                    }
                }
            }
            return new OkObjectResult(result);

        }

Per ulteriori dettagli, fare riferimento a qui