sql >> Databáze >  >> RDS >> PostgreSQL

Získejte přístupový token pro připojení k PostgreSQL ve funkcích Azure

Pokud chcete propojit databázi Postgres s Azure AD auth ve funkci Azure, můžeme Azure Managed Identity provést Azure AD auth a pak získat přístupový token Azure AD a připojit databázi.

Podrobné kroky jsou uvedeny níže

  1. Povolte Azure MSI pro vaši aplikaci Azure Functions

  2. Získejte ID klienta MSI

az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
  1. Konfigurace správce Azure AD v databázi Postgres

  2. K připojení databáze použijte správce Azure AD. (K připojení používám PgAdmin)

SET aad_validate_oids_in_tenant = off;
CREATE ROLE <userName> WITH LOGIN PASSWORD '<the appid of the MSI>' IN ROLE azure_ad_user;
  1. Nakonfigurujte bránu firewall serveru Postgres. Přidejte odchozí IP adresy aplikace Azure Function App do brány firewall. Informace o tom, jak získat odchozí IP adresy aplikace Azure Function App a nakonfigurovat bránu firewall serveru Postgres, najdete v zde a zde

  2. Pokud povolíte SSL, stáhněte si prosím certifikát SSL prostřednictvím odkazu

  3. Funkce. (K napsání ukázky používám jádro .net)

A. 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. přidat výše certifikát SSL v projektu. Například vytvořím složku cert v mém projektu a uložte certifikát do složky

C. kód


        [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);

        }

Další podrobnosti naleznete zde




  1. Docker:nelze připojit Spring Boot &MYSQL

  2. Django / MySQL:Jak provádět autonomní transakce (zadávat pouze podmnožinu dotazů)?

  3. MySQL Group By s nejvyšším N číslem každého druhu

  4. MySQL Visual Studio Nelze vytvořit okno návrhu pro vybraný objekt