您可以使用系統指派和使用者指派的受控識別來對 Azure Database for PostgreSQL 彈性伺服器執行個體進行身份驗證。 本文描述如何將系統指派的受控識別用於 Azure 虛擬機器 (VM),以存取適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。 受控識別由 Azure 自動管理,並可讓您驗證支援 Microsoft Entra 驗證的服務,而不需要將認證插入程式碼中。
您會了解如何:
- 將您的 VM 存取權授與適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。
- 在資料庫中建立使用者,以代表 VM 系統指派的身分識別。
- 使用 VM 身分識別取得存取權杖,並將其用來查詢適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。
- 在 C# 範例應用程式中實作權杖擷取。
先決條件
- 如果您不熟悉適用於 Azure 資源的受控識別功能,請參閱此概觀。 如果您沒有 Azure 帳戶,請先註冊免費帳戶,再繼續進行。
- 若要執行所需的資源建立和角色管理,您的帳戶必須在適當的範圍 (您的訂用帳戶或資源群組) 上具備「擁有者」權限。 如果您需要角色指派的協助,則請參閱指派 Azure 角色來管理 Azure 訂用帳戶資源的存取權。
- 您需要 Azure VM (例如,執行 Ubuntu Linux),而您想要使用 Azure VM 以使用受控身分識別來存取資料庫
- 您需要已設定 Microsoft Entra 驗證的適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體
- 若要遵循 C# 範例,請先完成如何與 C# 連線的指南
為您的 VM 建立系統指派的受控身分識別
搭配使用 az vm identity assign 與 identity assign 命令,以在現有 VM 上啟用系統指派的身分識別:
az vm identity assign -g myResourceGroup -n myVm
為系統指派的受控識別擷取應用程式識別碼,在接下來的幾個步驟中您需要此識別碼:
# Get the client ID (application ID) of the system-assigned managed identity
az ad sp list --display-name vm-name --query [*].appId --out tsv
為您的受控識別建立「適用於 PostgreSQL 的 Azure 資料庫」使用者
現在,以 Microsoft Entra 管理員使用者身分連線到適用於 PostgreSQL 的 Azure 資料庫彈性伺服器資料庫,然後執行下列 SQL 陳述式,將 <identity_name> 取代為您建立系統指派受控識別的資源名稱:
請注意,pgaadauth_create_principal 必須在 Postgres 資料庫上執行。
select * from pgaadauth_create_principal('<identity_name>', false, false);
成功看起來如下:
pgaadauth_create_principal
-----------------------------------
Created role for "<identity_name>"
(1 row)
如需管理已啟用 Microsoft Entra ID 的資料庫角色的詳細資訊,請參閱 在適用於 PostgreSQL 的 Azure 資料庫中管理 Microsoft Entra 角色。
使用身分識別名稱做為角色名稱並使用 Microsoft Entra 權杖做為密碼進行驗證時,受控身分識別現在會具有存取權。
備註
如果受控識別無效,則會傳回錯誤:ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...]。
如果您看到「沒有函式符合...」之類的錯誤,請確定您正在連線到 postgres 資料庫,而非您也建立的不同資料庫。
從 Azure 執行個體中繼資料服務擷取存取權杖
您的應用程式現在可以從 Azure 執行個體中繼資料服務擷取存取權杖,並用來向資料庫進行驗證。
藉由對 HTTP 發出 http://169.254.169.254/metadata/identity/oauth2/token 要求並傳遞下列參數來擷取此權杖:
api-version=2018-02-01resource=https://ossrdbms-aad.database.windows.net-
client_id=CLIENT_ID(您稍早已擷取)
您會取回包含 access_token 欄位的 JSON 結果 - 此長文字值是受控身分識別存取權杖,而您應該在連線至資料庫時使用此存取權杖來作為密碼。
針對測試目的,您可以在殼層中執行下列命令。
備註
請注意,您必須安裝 curl、jq 和 psql 用戶端。
# 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
您現在已連線至先前設定的資料庫。
使用受控身分識別進行連線
本節說明如何使用 VM 的使用者指派受控識別來取得存取權杖,並使用它來呼叫適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。 適用於 PostgreSQL 的 Azure 資料庫原生支援 Microsoft Entra 驗證,因此它可以直接接受使用 Azure 資源受控識別取得的存取權杖。 建立適用於 PostgreSQL 的 Azure 資料庫的連線時,您會在密碼欄位中傳遞存取權杖。
在 Python 中使用受控身分識別進行連線
如需 Python 程式碼範例,請參閱 快速入門:使用 Python 連線和查詢適用於 PostgreSQL 的 Azure 資料庫中的資料
在 Java 中使用受控身分識別進行連線
如需 Java 程式碼範例,請參閱 快速入門:搭配適用於 PostgreSQL 的 Azure 資料庫使用 Java 和 JDBC
在 C# 中使用受控身分識別進行連線
以下是使用存取權杖來開啟與「適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器」執行個體的連線的 .NET 程式碼範例。 此程式碼必須在 VM 上執行,才能使用系統指派的受控識別,從 Microsoft Entra ID 取得存取權杖。 取代 HOST、USER (為 <identity_name>) 和 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}");
}
}
}
您必須填寫以下的預留位置:
- HOST:將 your-server-name.postgres.database.azure.com 取代為執行個體的主機名稱。
- USER:將 <identity_name> 取代為您的受控識別名稱。
-
DATABASE:將 your-database-name 取代為您的「適用於 PostgreSQL 的 Azure 資料庫」執行個體的名稱。 - Microsoft Entra 驗證:程式碼會使用 VM 的系統指派受控識別,從 Microsoft Entra ID 擷取存取權杖。
執行時,此命令會提供如下的輸出:
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