PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Obtenir un jeton d'accès pour la connexion à PostgreSQL dans Azure Functions

Si vous souhaitez connecter la base de données Postgres avec l'authentification Azure AD dans la fonction Azure, nous pouvons Azure Managed Identity pour effectuer l'authentification Azure AD, puis obtenir le jeton d'accès Azure AD et connecter la base de données.

Les étapes détaillées sont comme ci-dessous

  1. Activez Azure MSI pour votre application de fonction Azure

  2. Obtenir l'identifiant client du MSI

az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
  1. Configurer l'administrateur Azure AD dans la base de données Postgres

  2. Utilisez l'administrateur Azure AD pour connecter la base de données. (J'utilise PgAdmin pour me connecter)

SET aad_validate_oids_in_tenant = off;
CREATE ROLE <userName> WITH LOGIN PASSWORD '<the appid of the MSI>' IN ROLE azure_ad_user;
  1. Configurez le pare-feu du serveur Postgres. Veuillez ajouter les adresses IP sortantes de l'application de fonction Azure dans le pare-feu. Pour savoir comment obtenir les adresses IP sortantes de l'application de fonction Azure et configurer le pare-feu du serveur Postgres, veuillez vous reporter à ici et ici

  2. Si vous activez SSL, veuillez télécharger certificat SSL via le lien

  3. Fonction. (J'utilise .net core pour écrire l'exemple)

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. ajouter ci-dessus le certificat SSL dans le projet. Par exemple, je crée un dossier cert dans mon projet et enregistrez le certificat dans le dossier

c. code


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

        }

Pour plus de détails, veuillez vous référer à ici