Dela via


Ansluta med hanterad identitet till Azure Database for PostgreSQL

GÄLLER FÖR: Azure Database for PostgreSQL – enskild server

Viktigt!

Azure Database for PostgreSQL – enskild server är på väg att dras tillbaka. Vi rekommenderar starkt att du uppgraderar till Azure Database for PostgreSQL – flexibel server. Mer information om hur du migrerar till Azure Database for PostgreSQL – flexibel server finns i Vad händer med Azure Database for PostgreSQL – enskild server?.

Du kan använda både systemtilldelade och användartilldelade hanterade identiteter för att autentisera till Azure Database for PostgreSQL. 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 Azure Database for PostgreSQL-server. Hanterade identiteter hanteras automatiskt av Azure och gör att du kan autentisera mot tjänster som stöder Microsoft Entra-autentisering, utan att du behöver infoga autentiseringsuppgifter i din kod.

Du lär dig att:

  • Ge den virtuella datorn åtkomst till en Azure Database for PostgreSQL-server
  • 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 fråga en Azure Database for PostgreSQL-server
  • Implementera tokenhämtningen i ett C#-exempelprogram

Förutsättningar

  • Om du inte känner till funktionen för hanterade identiteter för Azure-resurser kan du läsa igenom den här översikten. Om du inte har ett 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 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 åtkomst till databasen med hjälp av hanterad identitet
  • Du behöver en Azure Database for PostgreSQL-databasserver 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 enable the system-assigned identity to an existing VM:

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 PostgreSQL-användare för din hanterade identitet

Anslut nu som Microsoft Entra-administratörsanvändare till postgreSQL-databasen och kör följande SQL-instruktioner och ersätt CLIENT_ID med det klient-ID som du hämtade för din systemtilldelade hanterade identitet:

SET aad_validate_oids_in_tenant = off;
CREATE ROLE myuser WITH LOGIN PASSWORD 'CLIENT_ID' IN ROLE azure_ad_user;

Den hanterade identiteten har nu åtkomst när du autentiserar med användarnamnet myuser (ersätt med ett valfritt namn).

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 göra en HTTP-begäran till http://169.254.169.254/metadata/identity/oauth2/token och skicka följande parametrar:

  • api-version = 2018-02-01
  • resource = 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. 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@SERVER DBNAME

Nu är du ansluten till den databas som du har konfigurerat tidigare.

Ansluta med hanterad identitet i C#

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 Azure Database for PostgreSQL. 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 PostgreSQL skickar du åtkomsttoken i lösenordsfältet.

Här är ett .NET-kodexempel på hur du öppnar en anslutning till PostgreSQL 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, DATABASE och CLIENT_ID.

using System;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Npgsql;
using Azure.Identity;

namespace Driver
{
    class Script
    {
        // Obtain connection string information from the portal for use in the following variables
        private static string Host = "HOST";
        private static string User = "USER";
        private static string Database = "DATABASE";

        static async Task Main(string[] args)
        {
            //
            // Get an access token for PostgreSQL.
            //
            Console.Out.WriteLine("Getting access token from Azure AD...");

            // Azure AD resource ID for Azure Database for PostgreSQL is https://ossrdbms-aad.database.windows.net/
            string accessToken = null;

            try
            {
                // Call managed identities for Azure resources endpoint.
                var sqlServerTokenProvider = new DefaultAzureCredential();
                accessToken = (await sqlServerTokenProvider.GetTokenAsync(
                    new Azure.Core.TokenRequestContext(scopes: new string[] { "https://ossrdbms-aad.database.windows.net/.default" }) { })).Token;

            }
            catch (Exception e)
            {
                Console.Out.WriteLine("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                System.Environment.Exit(1);
            }

            //
            // Open a connection to the PostgreSQL server using the access token.
            //
            string connString =
                String.Format(
                    "Server={0}; User Id={1}; Database={2}; Port={3}; Password={4}; SSLMode=Prefer",
                    Host,
                    User,
                    Database,
                    5432,
                    accessToken);

            using (var conn = new NpgsqlConnection(connString))
            {
                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));
                    }
                }
            }
        }
    }
}

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

Nästa steg