sql >> Base de Datos >  >> RDS >> PostgreSQL

Obtener Access Token para la conexión a PostgreSQL en Azure Functions

Si desea conectar la base de datos de Postgres con la autenticación de Azure AD en la función de Azure, podemos usar Azure Managed Identity para realizar la autenticación de Azure AD y luego obtener el token de acceso de Azure AD y conectar la base de datos.

Los pasos detallados son los siguientes

  1. Habilite Azure MSI para su aplicación de funciones de Azure

  2. Obtenga la identificación de cliente del MSI

az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
  1. Configurar el administrador de Azure AD en la base de datos de Postgres

  2. Use el administrador de Azure AD para conectar la base de datos. (Uso PgAdmin para conectarme)

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 el servidor de seguridad de Postgres. Agregue las direcciones IP de salida de la aplicación de funciones de Azure en el firewall. Con respecto a cómo obtener las direcciones IP salientes de la aplicación de funciones de Azure y configurar el firewall del servidor de Postgres, consulte aquí y aquí

  2. Si habilita SSL, descargue certificado SSL a través del enlace

  3. Función. (Uso .net core para escribir la muestra)

una. 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. agregue el certificado SSL anterior en el proyecto. Por ejemplo, creo una carpeta cert en mi proyecto y guarde el certificado en la carpeta

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 obtener más detalles, consulte aquí