Ако искате да свържете база данни на Postgres с удостоверяване на Azure AD във функцията на Azure, можем да управляваме самоличността на Azure, за да направим удостоверяване на Azure AD, след което да получим токен за достъп на Azure AD и да свържем базата данни.
Подробните стъпки са както по-долу
-
Активирайте Azure MSI от вашето функционално приложение Azure
-
Вземете клиентския идентификатор на MSI
az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
-
Конфигуриране на администратор на Azure AD в база данни на Postgres
-
Използвайте администратора на 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;
-
Конфигурирайте защитната стена на сървъра на Postgres. Моля, добавете изходящите IP адреси на приложението на функцията Azure в защитната стена. Относно това как да получите изходящите IP адреси на приложението на функцията Azure и да конфигурирате защитната стена на сървъра на Postgres, моля, вижте тук и тук
-
Ако активирате SSL, моля, изтеглете SSL сертификат чрез връзката
-
функция. (Използвам .net ядро, за да напиша примера)
а. 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
в моя проект и запазете сертификата в папката
° С. код
[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);
}
За повече подробности, моля, вижте тук