Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Du kan använda både systemtilldelade och användartilldelade hanterade identiteter för att autentisera till en flexibel Azure Database for PostgreSQL-serverinstans. Den här artikeln visar hur du använder en systemtilldelad hanterad identitet för en virtuell Azure-dator (VM) för att få åtkomst till en flexibel Azure Database for PostgreSQL-serverinstans. Hanterade identiteter hanteras automatiskt av Azure och gör att du kan autentisera till tjänster som stöder Microsoft Entra-autentisering utan att behöva infoga autentiseringsuppgifter i koden.
Du lär dig att:
- Ge den virtuella datorn åtkomst till en flexibel Azure Database for PostgreSQL-serverinstans.
- Skapa en användare i databasen som representerar den virtuella datorns systemtilldelade identitet.
- Hämta en åtkomsttoken med hjälp av den virtuella datoridentiteten och använd den för att köra frågor mot en flexibel Azure Database for PostgreSQL-serverinstans.
- Implementera tokenhämtningen i ett C#-exempelprogram.
Förutsättningar
- Om du inte är bekant med funktionen hanterade identiteter för Azure-resurser kan du läsa den här översikten. Om du inte har något Azure-konto registrerar du dig för ett kostnadsfritt konto innan du fortsätter.
- För att kunna skapa den nödvändiga resursen och rollhanteringen måste ditt konto ha behörigheten "Ägare" i lämpligt omfång (din prenumeration eller resursgrupp). Om du behöver hjälp med en rolltilldelning kan du läsa Tilldela Azure-roller för att hantera åtkomst till dina Azure-prenumerationsresurser.
- Du behöver en virtuell Azure-dator (till exempel att köra Ubuntu Linux) som du vill använda för att komma åt databasen med hjälp av hanterad identitet
- Du behöver en flexibel Azure Database for PostgreSQL-serverinstans som har Microsoft Entra-autentisering konfigurerad
- Om du vill följa C#-exemplet slutför du först guiden om hur du ansluter med C#
Skapa en systemtilldelad hanterad identitet för den virtuella datorn
Använd az vm identity assign med identity assign kommandot aktiverar den systemtilldelade identiteten till en befintlig virtuell dator:
az vm identity assign -g myResourceGroup -n myVm
Hämta program-ID:t för den systemtilldelade hanterade identiteten, som du behöver i följande steg:
# Get the client ID (application ID) of the system-assigned managed identity
az ad sp list --display-name vm-name --query [*].appId --out tsv
Skapa en användare för Azure Database for PostgreSQL i din hanterade identitet
Anslut nu som Microsoft Entra-administratörsanvändare till din flexibla Azure Database for PostgreSQL-serverdatabas och kör följande SQL-instruktioner och ersätt <identity_name> med namnet på de resurser som du skapade en systemtilldelad hanterad identitet för:
Observera pgaadauth_create_principal måste köras i Postgres-databasen.
select * from pgaadauth_create_principal('<identity_name>', false, false);
Framgång ser ut så här:
pgaadauth_create_principal
-----------------------------------
Created role for "<identity_name>"
(1 row)
Mer information om hur du hanterar Microsoft Entra ID-aktiverade databasroller finns i Hantera Microsoft Entra-roller i Azure Database for PostgreSQL.
Den hanterade identiteten har nu åtkomst när du autentiserar med identitetsnamnet som ett rollnamn och Microsoft Entra-token som lösenord.
Anmärkning
Om den hanterade identiteten inte är giltig returneras ett fel: ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...].
Om du ser ett fel som "Ingen funktion matchar..." kontrollerar du att du ansluter till postgres databasen, inte en annan databas som du också har skapat.
Hämta åtkomsttoken från Azure Instance Metadata-tjänsten
Ditt program kan nu hämta en åtkomsttoken från Azure Instance Metadata-tjänsten och använda den för att autentisera med databasen.
Den här tokenhämtningen görs genom att skicka en HTTP begäran till http://169.254.169.254/metadata/identity/oauth2/token och skicka följande parametrar:
api-version=2018-02-01resource=https://ossrdbms-aad.database.windows.net-
client_id=CLIENT_ID(som du hämtade tidigare)
Du får tillbaka ett JSON-resultat som innehåller ett access_token fält – det här långa textvärdet är åtkomsttoken för hanterad identitet som du bör använda som lösenord när du ansluter till databasen.
I testsyfte kan du köra följande kommandon i gränssnittet.
Anmärkning
Observera att du behöver curl, jqoch psql klienten installerad.
# Retrieve the access token
export PGPASSWORD=`curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token`
# Connect to the database
psql -h SERVER --user USER DBNAME
Nu är du ansluten till den databas som du konfigurerade tidigare.
Ansluta med hanterad identitet
Det här avsnittet visar hur du hämtar en åtkomsttoken med hjälp av den virtuella datorns användartilldelade hanterade identitet och använder den för att anropa en flexibel Azure Database for PostgreSQL-serverinstans. Azure Database for PostgreSQL har inbyggt stöd för Microsoft Entra-autentisering, så att det direkt kan acceptera åtkomsttoken som hämtas med hanterade identiteter för Azure-resurser. När du skapar en anslutning till en Azure-databas för PostgreSQL skickar du åtkomsttokenet i lösenordsfältet.
Ansluta med hanterad identitet i Python
Ett Python-kodexempel finns i Snabbstart: Använd Python för att ansluta och fråga efter data i Azure Database for PostgreSQL
Ansluta med hanterad identitet i Java
Ett Java-kodexempel finns i Snabbstart: Använda Java och JDBC med Azure Database for PostgreSQL
Ansluta med hanterad identitet i C#
Här är ett .NET-kodexempel på hur du öppnar en anslutning till en flexibel Azure Database for PostgreSQL-serverinstans med hjälp av en åtkomsttoken. Den här koden måste köras på den virtuella datorn för att använda den systemtilldelade hanterade identiteten för att hämta en åtkomsttoken från Microsoft Entra-ID. Ersätt värdena för HOST, USER (med <identity_name>) och DATABASE.
using Azure.Identity;
using Npgsql;
using System;
class Program
{
static void Main(string[] args)
{
try
{
// Obtain an access token using the system-assigned managed identity
var tokenCredential = new DefaultAzureCredential();
var accessToken = tokenCredential.GetToken(
new Azure.Core.TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" })
);
// Build the connection string
string host = "your-server-name.postgres.database.azure.com"; // Replace with your flexible server's host
string database = "your-database-name"; // Replace with your database name
string user = "<identity_name>"; // Replace with your identity name (e.g., "myManagedIdentity")
var connectionString = $"Host={host};Database={database};Username={user};Password={accessToken.Token};SSL Mode=Require;Trust Server Certificate=true";
// Open a connection to the database
using var connection = new NpgsqlConnection(connectionString);
connection.Open();
Console.WriteLine("Connection successful!");
// Optional: Perform a simple query
using var command = new NpgsqlCommand("SELECT version();", connection);
using var reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"PostgreSQL version: {reader.GetString(0)}");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
Du måste fylla i följande platshållare:
- VÄRD: Ersätt your-server-name.postgres.database.azure.com med instansens värdnamn.
- ANVÄNDARE: Ersätt <identity_name> med namnet på din hanterade identitet.
-
DATABASE: Ersätt ditt databasnamn med namnet på din Azure Database for PostgreSQL-instans. - Microsoft Entra-autentisering: Koden använder den systemtilldelade hanterade identiteten för den virtuella datorn för att hämta en åtkomsttoken från Microsoft Entra-ID.
När du kör det här kommandot ger det här kommandot utdata så här:
Getting access token from Azure AD...
Opening connection using access token...
Connected!
Postgres version: PostgreSQL 11.11, compiled by Visual C++ build 1800, 64-bit