共用方式為


教學課程:使用受控識別將 Azure Web 應用程式連線至沒有秘密的 Azure SQL 資料庫

Azure App Service可在 Azure 中提供可高度擴充、自我修復的 Web 主控服務。 App Service 也提供應用程式的 受控識別 ,這是保護 Azure SQL 和其他 Azure 服務存取權的周全解決方案。 App Service 中的受控識別可藉由消除秘密,例如連接字串中的認證,讓您的應用程式更安全。

本教學課程說明如何將受控識別新增至具有 Azure SQL 後端的範例 .NET 應用程式。 完成之後,您的應用程式可以安全地連線到 Azure SQL 資料庫,而不需要使用者名稱和密碼。

教學課程案例的架構圖。

在本教學課程中,您會:

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

如需在 Node.js、Python 和 Java 架構中使用適用於 MySQL 的 Azure 資料庫或適用於 PostgreSQL 的 Azure 資料庫的相關指引,請參閱 教學課程:使用受控識別從 App Service 連線到 Azure 資料庫,而不需要秘密

附註

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

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

先決條件

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

  • 擁有基本的 Azure App Service ASP.NET MVCASP.NET Core MVC create-read-update-delete (CRUD) 應用程式,其使用 Azure SQL Database 搭配 SQL 驗證作為後端。 本教學課程中的步驟支援下列 .NET 版本:

    • .NET Framework 4.8 和更新版本
    • .NET 6.0 和更新版本
  • 允許從您的電腦到 Azure 的用戶端連線,因此您可以在開發環境中對應用程式進行偵錯。 您可以遵循 使用 Azure 入口網站管理伺服器層級 IP 防火牆規則中的步驟來新增用戶端 IP 位址。

  • 登入 Azure Cloud Shell,或準備您的環境以使用 Azure CLI。

將資料庫管理員存取權授與 Microsoft Entra 使用者

將 Microsoft Entra 使用者指派為 Azure SQL Server 的管理員,以啟用Microsoft Entra 驗證至 Azure SQL 資料庫。 Microsoft Entra 系統管理員必須是建立、匯入、同步處理或受邀加入 Microsoft Entra ID 的使用者。 此使用者可能與 Azure 訂用帳戶的 Microsoft 帳戶使用者不同。

在 Azure Cloud Shell 的 Bash 環境中,或在本機登入 Azure CLI 之後執行下列命令。

  1. 使用 az ad user listdisplay-namefilterupn 參數一起,以取得欲設為管理員的 Microsoft Entra ID 使用者的物件 ID。獨立執行 az ad user list 以顯示 Microsoft Entra 目錄中所有用戶的資訊。

    例如,下列命令會列出 display-name 為 Firstname Lastname 的 Microsoft Entra ID 使用者資訊。

    az ad user list --display-name "Firstname Lastname"
    

    以下是範例輸出:

     "businessPhones": [],
     "displayName": "Firstname Lastname",
     "givenName": null,
     "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
     "jobTitle": null,
     "mail": "firstname@contoso.com",
     "mobilePhone": null,
     "officeLocation": null,
     "preferredLanguage": null,
     "surname": null,
     "userPrincipalName": "firstname@contoso.com"
    
  2. 使用 az sql server ad-admin create 參數 object-id ,將 Microsoft Entra ID 使用者新增為 Azure SQL Server 上的系統管理員。 在下列命令中,將<server-name>取代為您的伺服器名稱(不含.database.windows.net後綴),並將<entra-id>替換為來自前述id命令輸出的az ad user list值。

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

設定應用程式的受控識別連線能力

下列步驟會使用系統指派的受控識別,設定您的應用程式以連線到 Azure SQL Database。 若要使用使用者指派的身分識別,請參閱 教學課程:使用受控識別從App Service連線到 Azure 資料庫,而不需要秘密

啟用應用程式的受控識別

若要為 Azure 應用程式啟用受控識別,請使用 az webapp identity assign 命令,將 取代 <app-name> 為您的應用程式名稱。 系統指派的身分識別名稱一律與應用程式名稱相同。

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

輸出的範例如下:

{
  "additionalProperties": {},
  "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "type": "SystemAssigned"
}

若要啟用部署插槽的受控識別,請將--slot <slot-name>新增至上述命令,並使用<slot-name>中的插槽名稱。 部署位置的系統指派身分識別名稱為 <app-name>/slots/<slot-name>

您也可以將身分識別新增至 Microsoft Entra 群組,然後將 SQL Database 存取權授與 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 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. 開啟 PowerShell 命令行,並使用下列 SQLCMD 命令登入 SQL Database。 將<server-name>替換為您的伺服器名稱,<db-name>替換為您的資料庫名稱,以及<admin-user>替換為上面userPrincipalName指令輸出結果中的系統管理員使用者的az ad user list

    sqlcmd -S <servername>.database.windows.net -d <db-name> -U <admin-user> -G -l 30
    

    請遵循提示登入。

  2. 在 SQL 提示字元中,執行下列命令,將資料庫所需的最低許可權授與應用程式。 將 <identity-name> 取代為 Microsoft Entra ID 中受管理的識別名稱,該名稱與應用程式名稱相同。

    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
    

附註

後端受控識別服務 會維護令牌快取 ,該快取只會在目標資源到期時更新其令牌。 如果您在第一次使用應用程式取得權杖後嘗試修改 SQL Database 權限,則在快取權杖到期之前,您都不會取得具有更新權限的新權杖。

拿掉原始連接字串

您在 web.configappsettings.json 所做的任何變更,都使用受控識別。 您可以移除第一次部署應用程式時所使用的原始連接字串。 若要移除連接字串,請執行下列 Azure CLI 命令,並將 <app-name> 取代為您的應用程式名稱,將 <connection-string-name> 取代為您的連接字串名稱。

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

設定開發環境

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

Visual Studio for Windows 會與 Microsoft Entra 驗證整合。

  1. 若要在 Visual Studio 中啟用開發和偵錯,請從頂端功能表中選取 [ 檔案>帳戶設定 ],然後選取 [ 登入 ] 或 [ 新增],在 Visual Studio 中新增您的 Microsoft Entra 使用者。
  2. 若要設定 Azure 服務驗證的Microsoft Entra 使用者,請從頂端功能表中選取 [工具>選項 ],然後選取 [Azure 服務驗證>帳戶選取]。 選取您新增的 Microsoft Entra 使用者,然後選取 [確定]

修改專案併發佈您的應用程式

Azure SQL 資料庫支援的 Web 應用程式會使用資料庫內容來與資料庫連線。 若要使用 Microsoft Entra 驗證來處理應用程式,您必須更新資料庫內容,以參考 Entity Framework SQL Server 提供者,這取決於現代 Microsoft.Data.SqlClient ADO.NET 提供者。

Entity Framework 提供者將取代內建的 System.Data.SqlClient SQL Server 提供者,並包含對於 Microsoft Entra ID 驗證方法的支援。 如需詳細資訊,請參閱 Microsoft.EntityFramework.SqlServer

[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))] 在本機運作以將 Microsoft.Data.SqlClient 用於資料庫內容,但因為 System.Data.SqlClient 已硬式編碼為 Azure App Service 中的提供者,因此您必須擴充 MicrosoftSqlDbConfiguration 以改為將 System.Data.SqlClient 參考重新導向至 Microsoft.Data.SqlClient。 這些步驟會因您有 ASP.NET 或 ASP.NET Core 應用程式而有所不同。

ASP.NET Core 應用程式預設會使用 Entity Framework Core

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

    Install-Package Microsoft.Data.SqlClient
    
  2. appsettings.json中,以下列程式代碼取代連接字串的值,並以您的伺服器名稱和資料庫名稱取代 <server-name<database-name>

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

    附註

    您可以在本機計算機和 Azure App Service 中使用 Active Directory 預設 驗證。 驅動程式可以透過數種不同的方式,從 Microsoft Entra 識別碼取得令牌。

    如果應用程式被部署,驅動程式會從應用程式的系統分配的管理識別中獲得令牌。 如果您在連接字串中包含 User Id=<client-id-of-user-assigned-managed-identity>;,驅動程式也可以使用使用者指派的受控識別進行驗證。

    類別 DefaultAzureCredential 會在記憶體中快取令牌,並在到期前從Microsoft Entra ID 擷取令牌。 您不需使用任何自訂程式碼來重新整理權杖。

    您現在已經擁有在 Visual Studio 中偵錯時連接到 Azure SQL Database 所需的一切。 您的程式代碼會使用您在設定開發環境時所設定Microsoft Entra 使用者。

  3. 執行您的應用程式。 瀏覽器中的 CRUD 應用程式會使用 Microsoft Entra 驗證,直接連線到 Azure SQL 資料庫。 此設定可讓您從 Visual Studio 執行資料庫移轉。

  4. 使用下列 Git 命令發佈您的變更:

    git commit -am "configure managed identity"
    git push azure main
    

測試應用程式

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

螢幕快照,顯示 Code First Migration 之後的 Azure 應用程式。

您現在可以編輯 to-do 清單。

清除資源

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

az group delete --name myResourceGroup

執行此命令約需一分鐘。