在 Azure Functions 中获取用于连接到 PostgreSQL 的访问令牌

Obtain Access Token for the connection to PostgreSQL in Azure Functions

我已经创建了一些 Azure Functions,我想使用访问令牌连接到 Postgres 数据库(因为用户的连接正在向 Azure Functions 的端点发出请求)。我一直在关注此页面:https://docs.microsoft.com/en-us/azure/postgresql/howto-configure-sign-in-aad-authentication

为了 Authentication/Authorization 在我的函数中,我创建了一个 Azure Active Directory 应用程序(在应用程序注册中)。在此应用程序中,(不确定这是否有用)我已授予对 OSSRDBMS 的 API 的权限:

然后,我获得应用服务的下一个端点的访问令牌(我的函数在哪里):

MYAPP_SERVICE.azurewebsites.net/.auth/me

我正在尝试与此访问令牌建立连接,但似乎不是一个好方法。我缺少什么或如何获得正确的访问令牌?我了解如何使用 Azure CLI,但我正在尝试使用我的应用服务端点的访问令牌...或者我可以执行 HTTP 请求以获取正确的令牌吗?
在这件事上我需要一些指导。



预先感谢

如果你想在 Azure 函数中连接 Postgres 数据库和 Azure AD 身份验证,我们可以使用 Azure Managed Identity 进行 Azure AD 身份验证,然后获取 Azure AD 访问令牌并连接数据库。

详细步骤如下

  1. 为您的 Azure 函数应用启用 Azure MSI

  2. 获取 MSI 的客户端 ID

az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
  1. Configure Azure AD admin in Postgres database

  2. 使用 Azure AD 管理员连接数据库。 (我使用 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. 配置 Postgres 服务器防火墙。请在防火墙中添加 Azure 函数应用出站 IP 地址。关于如何获取Azure Function App出站IP地址和配置Postgres服务器防火墙,请参考here and here

  2. 如果启用SSL,请下载SSL certificate via the link

  3. 函数。 (我使用.net core 编写示例)

一个。 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。在项目中添加上面的 SSL 证书。例如,我在我的项目中创建了一个文件夹cert,并将证书保存在文件夹

c。代码


        [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 = "testuer@test05";
            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);

        }

详情请参考here