教學課程:使用受控識別從 .NET App Service 連線到 SQL Database 而不使用秘密

App Service 可在 Azure 中提供可高度擴充、自我修復的 Web 主控服務。 它也為您的應用程式提供受控識別,這是用於保護 Azure SQL Database 和其他 Azure 服務存取權的周全解決方案。 App Service 中的受控識別可藉由從應用程式刪除祕密 (例如連接字串中的認證),讓應用程式更加安全。 在本教學課程中,您要將受控識別新增至您在下列其中一個教學課程所建置的 Web 應用程式範例:

當您完成時,範例應用程式不需要使用者名稱和密碼,即可安全地連線到 SQL Database。

教學課程案例的架構圖表。

注意

本教學課程所涵蓋的步驟支援下列版本:

  • .NET Framework 4.8 和更新版本
  • .NET 6.0 和更新版本

如需其他語言架構 (Node.js、Python 和 JAVA) 中適用於 MySQL 的 Azure 資料庫或適用於 PostgreSQL 的 Azure 資料庫的指導,請參閱教學課程:使用受控識別從 App Service 連線到 Azure 資料庫,而不使用秘密

您將了解:

  • 啟用受控識別
  • 將 SQL Database 存取權授與受控識別
  • 設定 Entity Framework 以將 Microsoft Entra 驗證用於 SQL Database
  • 使用 Microsoft Entra 驗證從 Visual Studio 連線至 SQL Database

注意

Microsoft Entra 驗證與內部部署 Active Directory (AD DS) 中的整合式 Windows 驗證不同。 AD DS 和 Microsoft Entra ID 使用完全不同的驗證通訊協定。 如需詳細資訊,請參閱 Microsoft Entra Domain Services 文件

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

必要條件

本文會從您在以下教學課程之一中中斷處繼續:

如果您尚未進行,請先依照這兩個教學課程的其中一個來進行。 或者,您可以使用 SQL Database 針對自己的 .NET 應用程式調整步驟。

若要使用 SQL Database 作為後端對您的應用程式進行偵錯,請確定您已允許從您的電腦進行用戶端連線。 如果尚未這麼做,請遵循使用 Azure 入口網站管理伺服器層級 IP 防火牆規則中的步驟來新增用戶端 IP。

備妥環境以使用 Azure CLI。

1.將資料庫存取權授與 Microsoft Entra 使用者

首先,將 Microsoft Entra 使用者指派為伺服器管理員,啟用對 SQL 資料庫的 Microsoft Entra 驗證。 此使用者與您用來註冊 Azure 訂用帳戶的 Microsoft 帳戶不同。 這必須是您已在 Microsoft Entra ID 中建立、匯入、同步處理或受邀加入的使用者。 若要進一步了解允許的 Microsoft Entra 使用者,請參閱 SQL Database 中的 Microsoft Entra 功能和限制

  1. 如果您的 Microsoft Entra 租用戶還沒有使用者,請依照使用 Microsoft Entra ID 新增或刪除使用者中的步驟建立一個。

  2. 使用 az ad user list 尋找 Microsoft Entra 使用者的物件識別碼,並取代 <user-principal-name>。 結果會儲存到變數中。

    $azureaduser=(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query '[].id' --output tsv)
    

    提示

    若要在 Microsoft Entra 中查看所有使用者主體名稱的清單,請執行 az ad user list --query '[].userPrincipalName'

  3. 在 Cloud Shell 中使用 az sql server ad-admin create 命令,將此 Microsoft Entra 使用者新增為 Active Directory 管理員。 在下列命令中,將 <server-name> 取代為 伺服器名稱 (不含 .database.windows.net 尾碼)。

    az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

如需關於新增 Active Directory 管理員的詳細資訊,請參閱為伺服器佈建 Microsoft Entra 管理員

2.設定開發環境

  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 驗證開發和偵錯您的應用程式。

3.修改專案

注意

不再建議使用 Microsoft.Azure.Services.AppAuthentication 搭配新的 Azure SDK。 適用於 .NET、JAVA、TypeScript 和 Python 的新 Azure 身分識別用戶端程式庫會取而代之,而且所有新部署均應使用。 如需如何移轉至 Azure Identity 的資訊,請參閱這裡: AppAuthentication 至 Azure.Identity 移轉指導

您針對專案遵循的步驟取決於您使用的是 Entity Framework Core (ASP.NET Core 預設),還是 Entity Framework Core (ASP.NET Core 預設)。

  1. 在 Visual Studio 中,開啟套件管理員主控台,並新增 NuGet 套件 Microsoft.Data.SqlClient

    Install-Package Microsoft.Data.SqlClient -Version 5.1.0
    
  2. ASP.NET Core 和 SQL Database 教學課程中,尚未使用 appsettings.json 中的連接字串 MyDbConnection。 本機環境和 Azure 環境都會從其各自的環境變數取得連接字串,以便將連線秘密保存在來源檔案之外。 但現在使用 Active Directory 驗證,沒有其他秘密。 在 appsettings.json 中,將 MyDbConnection 連接字串的值取代為:

    "Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
    

    注意

    Active Directory 預設驗證類型可用於本機電腦和 Azure App Service。 驅動程式嘗試使用各種方式從 Microsoft Entra ID 取得權杖。 如果部署應用程式,它會從應用程式的系統指派受控識別取得令牌。 如果您將下列專案包含在 連接字串 中,User Id=<client-id-of-user-assigned-managed-identity>;也可以向使用者指派的受控識別進行驗證。 如果應用程式在本機執行,會嘗試從 Visual Studio、Visual Studio Code 和 Azure CLI 取得權杖。

    這正是要連線至 SQL Database 所需的所有項目。 當您在 Visual Studio 中偵錯時,您的程式代碼會使用您在 2 中設定的 Microsoft Entra 使用者。設定開發環境。 稍後,您將設定 SQL Database 以允許來自 App Service 應用程式受控識別的連線。 DefaultAzureCredential 類別會快取記憶體中的權杖,並在到期之前從 Microsoft Entra ID 擷取權杖。 您不需使用任何自訂程式碼來重新整理權杖。

  3. 輸入 Ctrl+F5 以再次執行應用程式。 瀏覽器中的相同 CRUD 應用程式此時會使用 Microsoft Entra 驗證直接連線至 Azure SQL Database。 此設定可讓您從 Visual Studio 執行資料庫移轉。

4.使用受控識別連線

接著,您將設定 App Service 應用程式,以使用系統指派的受控識別連線至 SQL Database。

注意

雖然本節中的指示適用於系統指派的身分識別,但您也可以輕鬆使用使用者指派的身分識別。 若要執行此工作, 您需要變更 az webapp identity assign command,才能指派所需的使用者指派身分識別。 然後,在建立 SQL 使用者時,請務必使用使用者指派的身分識別資源名稱,不要使用網站名稱。

啟用應用程式上的受控識別

若要啟用 Azure 應用程式的受控識別,請在 Cloud Shell 中使用 az webapp identity assign 命令。 在下列命令中取代 <app-name>

az webapp identity assign --resource-group myResourceGroup --name <app-name>

注意

若要啟用部署位置的受控識別,請新增 --slot <slot-name> 並在 <slot-name> 中使用位置名稱。

以下是輸出的範例:

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

將權限授與受控識別

注意

如有需要,您可以將身分識別新增至 Microsoft Entra 群組,然後將 SQL Database 存取權授與 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 myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. 在 Cloud Shell 中,使用 SQLCMD 命令登入 SQL Database。 請將 <server-name> 取代為您的伺服器名稱,將 <db-name> 取代為您的應用程式使用的資料庫名稱,並將 <aad-user-name> 和 <aad-password> 取代為您 Microsoft Entra 使用者的認證。

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. 在您所需資料庫的 SQL 提示字元中執行下列命令,以授與您應用程式所需的最低權限。 例如,

    CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
    GO
    

    <identity-name> 是 Microsoft Entra ID 中的受控識別名稱。 如果身分識別是由系統指派,則名稱一律與您 App Service 應用程式名稱相同。 針對部署位置,其系統指派的身分識別名稱是 <app-name>/slots/<slot-name>。 若要為 Microsoft Entra 群組授與權限,請改用群組的顯示名稱 (例如 myAzureSQLDBAccessGroup)。

  3. 輸入 EXIT 以返回 Cloud Shell 提示字元。

    注意

    受控識別的後端服務也會維護權杖快取,只有當目標資源過期時,才會更新其權杖。 如果您在設定 SQL Database 權限時發生錯誤,並在嘗試透過應用程式取得權杖之後嘗試修改權限,則在快取的權杖過期前,您實際上不會取得具有更新權限的新權杖。

    注意

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

修改連接字串

請記住,您在 Web.config 或 appsettings.json 中所做的相同變更也適用於受控識別,因此您唯一要做的,就是在 App Service 中移除現有的連接字串,也就是 Visual Studio 在第一次部署您的應用程式時建立的字串。 使用下列命令,但將 <app-name> 取代為您的應用程式名稱。

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5.發佈您的變更

現在只剩下將您的變更發佈至 Azure。

  1. 如果您來自教學課程:在 Azure 中搭配 SQL Database 來建置 ASP.NET 應用程式,請在 Visual Studio 中發佈變更。 在 [方案總管] 中,以滑鼠右鍵按一下 [DotNetAppSqlDb] 專案,然後選取 [發佈]

    從 方案總管發佈

  2. 在發佈頁面中,選取 [發佈]

    重要

    請確定您的 App Services 名稱與現有的任何應用程式註冊不符。 這會導致主體識別碼衝突。

當新的網頁顯示待辦事項清單時,表示應用程式正使用受控識別連線到資料庫。

Code First 移轉之後的 Azure 應用程式

您現在應該能夠如以往一樣編輯待辦事項清單。

清除資源

在上述步驟中,您已建立資源群組中的 Azure 資源。 如果您在未來不需要這些資源,請在 Cloud Shell 中執行下列命令,刪除資源群組:

az group delete --name myResourceGroup

此命令可能會花一分鐘執行。

下一步

您已了解如何︰

  • 啟用受控識別
  • 將 SQL Database 存取權授與受控識別
  • 設定 Entity Framework 以將 Microsoft Entra 驗證用於 SQL Database
  • 使用 Microsoft Entra 驗證從 Visual Studio 連線至 SQL Database