Jika Anda ingin menghubungkan database Postgres dengan autentikasi Azure AD di fungsi Azure, kita dapat menggunakan Azure Managed Identity untuk melakukan autentikasi Azure AD kemudian mendapatkan token akses Azure AD dan menghubungkan database.
Langkah-langkah detailnya seperti di bawah ini
az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
-
Gunakan admin Azure AD untuk menyambungkan database. (Saya menggunakan PgAdmin untuk terhubung)
SET aad_validate_oids_in_tenant = off;
CREATE ROLE <userName> WITH LOGIN PASSWORD '<the appid of the MSI>' IN ROLE azure_ad_user;
-
Konfigurasikan firewall server Postgres. Harap tambahkan alamat IP keluar aplikasi fungsi Azure di firewall. Mengenai cara mendapatkan alamat IP keluar aplikasi fungsi Azure dan mengkonfigurasi firewall server Postgres, silakan merujuk ke di sini dan di sini
-
Jika Anda mengaktifkan SSL, harap unduh sertifikat SSL melalui tautan
-
Fungsi. (Saya menggunakan .net core untuk menulis sampel)
sebuah. 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. tambahkan sertifikat SSL di atas dalam proyek. Misalnya, saya membuat folder cert
di proyek saya dan simpan sertifikat di folder
c. kode
[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);
}
Untuk detail selengkapnya, lihat di sini