PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Obtenha o token de acesso para a conexão com o PostgreSQL no Azure Functions


Se você deseja conectar o banco de dados Postgres com a autenticação do Azure AD na função do Azure, podemos Azure Managed Identity para fazer a autenticação do Azure AD e obter o token de acesso do Azure AD e conectar o banco de dados.

As etapas detalhadas são como abaixo

  1. Habilite o Azure MSI para seu aplicativo de funções do Azure

  2. Obtenha o ID do cliente do MSI
az login
az ad sp show --id <the object id of the msi> --query appId --output tsv

  1. Configurar o administrador do Azure AD no banco de dados Postgres

  2. Use o administrador do Azure AD para conectar o banco de dados. (Eu uso o PgAdmin para conectar)
SET aad_validate_oids_in_tenant = off;
CREATE ROLE <userName> WITH LOGIN PASSWORD '<the appid of the MSI>' IN ROLE azure_ad_user;

  1. Configure o firewall do servidor Postgres. Adicione os endereços IP de saída do aplicativo de funções do Azure no firewall. Sobre como obter os endereços IP de saída do aplicativo de funções do Azure e configurar o firewall do servidor Postgres, consulte aqui e aqui

  2. Se você habilitar o SSL, faça o download do certificado SSL através do link

  3. Função. (Eu uso .net core para escrever a amostra)

uma. 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. adicione o certificado SSL acima no projeto. Por exemplo, eu crio uma pasta cert no meu projeto e salve o cert na pasta

c. código

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

        }



Para obter mais detalhes, consulte aqui