教學課程:使用無祕密的受控識別從 App Service 連線至 Azure 資料庫

App Service 可在 Azure 中提供可高度擴充、自我修復的 Web 主控服務。 此服務也為您的應用程式提供受控識別,這是用於保護下列 Azure 資料庫存取權的周全解決方案:

注意

本教學課程不包含 Azure Cosmos DB 的指引,因為其支援不同方式的 Microsoft Entra 驗證。 如需詳細資訊,請參閱 Azure Cosmos DB 文件,例如使用系統指派的受控識別存取 Azure Cosmos DB 資料

App Service 中的受控識別可藉由從應用程式刪除祕密 (例如連接字串中的認證),讓應用程式更加安全。 本教學課程說明如何使用受控識別,從 App Service 連線到上述資料庫。

您將了解:

  • 將 Microsoft Entra 使用者設定為 Azure 資料庫的系統管理員。
  • 以 Microsoft Entra 使用者身分連線到您的資料庫。
  • 為 App Service 應用程式設定系統指派或使用者指派的受控識別。
  • 將資料庫存取權授與受控識別。
  • 使用受控識別,透過程式碼 (.NET Framework 4.8、.NET 6、Node.js、Python、Java) 連線到 Azure 資料庫。
  • 使用 Microsoft Entra 使用者,透過開發環境連線到 Azure 資料庫。

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

  • 在 App Service 中建立以 .NET、Node.js、Python 或 Java 為基礎的應用程式。
  • 使用 Azure SQL Database、適用於 MySQL 的 Azure 資料庫或適用於 PostgreSQL 的 Azure 資料庫,建立資料庫伺服器。
  • 您應該熟悉標準連線模式 (透過使用者名稱和密碼),並能夠成功從您的 App Service 應用程式連線到所選資料庫。

備妥環境以使用 Azure CLI。

1.安裝服務連接器 無密碼擴充功能

安裝 Azure CLI 的服務連接器 無密碼擴充功能:

az extension add --name serviceconnector-passwordless --upgrade

2.建立無密碼連線

接下來,使用服務連接器建立無密碼連線。

提示

Azure 入口網站可協助您撰寫下列命令。 在 Azure 入口網站中,前往 Azure App Service 資源,從左側功能表中選取 [服務連接器],然後選取 [建立]。 在表單中填寫所有必要參數。 Azure 會自動產生連線建立命令,您可以複製命令以在 CLI 中使用,或在 Azure Cloud Shell 中執行。

使用 --client-type 參數執行下列 Azure CLI 命令。

  1. 選擇性地執行 az webapp connection create sql -h 以取得支援的客戶端類型。

  2. 選擇客戶端類型並執行對應的命令。 請將下列預留位置取代為您自己的資訊。

    az webapp connection create sql \
        --resource-group <group-name> \
        --name <server-name> \
        --target-resource-group <sql-group-name> \
        --server <sql-name> \
        --database <database-name> \
        --user-identity client-id=<client-id> subs-id=<subscription-id> \
        --client-type <client-type>
    

此服務連接器命令會在背景中完成下列工作:

  • 啟用系統指派的受控識別,或為 Azure App Service 所裝載的應用程式 <server-name> 指派使用者身分識別。
  • 將 Microsoft Entra 系統管理員設定為目前的登入使用者。
  • 為系統指派的受控識別或使用者指派的受控識別新增資料庫使用者。 將資料庫的所有權限 <database-name> 授與此使用者。 您可以在上述指令輸出中的連接字串中找到使用者名稱。
  • 根據資料庫類型,將名為 AZURE_MYSQL_CONNECTIONSTRINGAZURE_POSTGRESQL_CONNECTIONSTRINGAZURE_SQL_CONNECTIONSTRING 的組態設定為 Azure 資源。
  • 針對 App Service,組態會在 [應用程式設定] 刀鋒視窗中設定。

如果您在建立連線時遇到任何問題,請參閱疑難排解以取得協助。

3.修改您的程式碼

  1. 安裝相依性。

    dotnet add package Microsoft.Data.SqlClient
    
  2. 從服務連接器新增的環境變數取得 Azure SQL Database 連結字串。

    using Microsoft.Data.SqlClient;
    
    // AZURE_SQL_CONNECTIONSTRING should be one of the following:
    // For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
    // For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    如需詳細資訊,請參閱使用 Active Directory 受控識別驗證

如需更多資訊,請參閱 Microsoft SQL Server 用戶端程式設計的首頁。 如需更多程式代碼範例,請參閱透過服務連接器建立資料庫服務的無密碼連線。

4.設定開發環境

此範例程式碼會使用 DefaultAzureCredential,從 Microsoft Entra ID 取得 Azure 資料庫的可用權杖,然後將它新增至資料庫連結。 雖然您可以自訂 DefaultAzureCredential,但其已預設為通用。 這會根據您的執行位置為本機開發環境或 App Service,以從登入的 Microsoft Entra 使用者或受控識別取得權杖。

程式碼不需任何進一步的變更,即已準備就緒可在 Azure 中執行。 不過,若要在本機對程式碼進行偵錯,開發環境需要使用登入的 Microsoft Entra 使用者。 在此步驟中,您會以 Microsoft Entra 使用者身分登入,來設定所選環境。

  1. Visual Studio for Windows 會與 Microsoft Entra 驗證整合。 若要啟用 Visual Studio 中的開發和偵錯功能,請從功能表中選取 [檔案]>[帳戶設定],然後選取 [登入] 或 [新增],以在 Visual Studio 中新增您的 Microsoft Entra 使用者。

  2. 若要設定 Azure 服務驗證的 Microsoft Entra 使用者,請從功能表中選取 [工具]>[選項],然後選取 [Azure 服務驗證]>[帳戶選取]。 選取您新增的 Microsoft Entra 使用者,然後選取 [確定]

如需如何設定 Microsoft Entra 驗證開發環境的詳細資訊,請參閱適用於 .NET 的 Azure 身分識別用戶端程式庫

現在您已可開始將 SQL Database 作為後端,使用 Microsoft Entra 驗證開發和偵錯您的應用程式。

5.儲存並發佈

  1. 在開發環境中執行您的程式碼。 程式碼會在環境中使用登入的 Microsoft Entra 使用者,連線到後端資料庫。 由於該使用者已設定為資料庫的 Microsoft Entra 系統管理員,因此可以存取資料庫。

  2. 使用慣用的發佈方法將您的程式碼發佈至 Azure。 在 App Service 中,程式碼會使用應用程式的受控識別來連線到後端資料庫。

常見問題集

受控識別是否支援 SQL Server?

內部部署 SQL Server 不支援 Microsoft Entra ID 和受控識別。

我收到下列錯誤 Login failed for user '<token-identified principal>'.

您嘗試要求權杖的受控識別未獲授權存取 Azure 資料庫。

我已變更 App Service 驗證或相關聯的應用程式註冊。 為什麼仍會取得舊的權杖?

受控識別的後端服務也會維護權杖快取;只有當權杖過期時,才會為目標資源更新其權杖。 如果您在嘗試透過應用程式取得權杖「之後」修改設定,實際上要等到快取的權杖過期,您才會取得具有更新權限的新權杖。 若要解決此問題,最佳方式是使用新的 InPrivate (Edge)/private (Safari)/Incognito (Chrome) 視窗來測試變更。 這樣就一定會從全新的已驗證工作階段開始。

如何將受控識別新增至 Microsoft Entra 群組?

如有需要,您可以將身分識別新增至 Microsoft Entra 群組,然後將存取權授與 Microsoft Entra 群組,而不是身分識別。 例如,下列命令會將上一個步驟中的受控識別新增至名為 myAzureSQLDBAccessGroup 的新群組:

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

若要授與 Microsoft Entra 群組的資料庫權限,請參閱個別資料庫類型的文件。

我收到下列錯誤 SSL connection is required. Please specify SSL options and retry

連線到 Azure 資料庫需要額外的設定,而這些資訊不在本教學課程的涵蓋範圍內。 如需詳細資訊,請參閱下列其中一個連結:

在適用於 PostgreSQL 的 Azure 資料庫 - 單一伺服器中設定 TLS 連線能力在您的應用程式中設定 SSL 連線能力,以安全地連線至適用於 MySQL 的 Azure 資料庫

下一步

您已了解如何︰

  • 將 Microsoft Entra 使用者設定為 Azure 資料庫的系統管理員。
  • 以 Microsoft Entra 使用者身分連線到您的資料庫。
  • 為 App Service 應用程式設定系統指派或使用者指派的受控識別。
  • 將資料庫存取權授與受控識別。
  • 使用受控識別,透過程式碼 (.NET Framework 4.8、.NET 6、Node.js、Python、Java) 連線到 Azure 資料庫。
  • 使用 Microsoft Entra 使用者,透過開發環境連線到 Azure 資料庫。