教學課程:使用 Windows VM 系統指派的受控識別來存取 Azure SQL

本教學課程說明如何使用 Windows 虛擬機器 (VM) 的系統指派身分識別來存取 Azure SQL 資料庫。 受控服務識別會自動由 Azure 管理,並可讓您向支援 Microsoft Entra 驗證的服務進行驗證,而不需要將認證插入您的程式碼中。 您將學習如何:

  • 將您的 VM 存取權授與 Azure SQL 資料庫
  • 啟用 Microsoft Entra 驗證
  • 在資料庫中建立代表 VM 系統指派身分識別的自主使用者
  • 使用 VM 身分識別取得存取權杖,並用它來查詢 Azure SQL 資料庫

必要條件

Enable

啟用系統指派的受控識別是一鍵式體驗。 您可以在建立 VM 期間或在現有 VM 的屬性中啟用它。

Screenshot shows the System assigned tab for a virtual machine where you can turn on the System assigned status.

若要在新 VM 上啟用系統指派的受控識別:

  1. 登入 Azure 入口網站

  2. 建立已啟用系統指派身分識別的虛擬機器

授予存取權

若要將 VM 存取權授與 Azure SQL 資料庫中的資料庫,您可以使用現有的 邏輯 SQL 伺服器或建立新的 SQL 伺服器 。 若要使用 Azure 入口網站建立新的伺服器和資料庫,請遵循此 Azure SQL 快速入門 。 Azure SQL 檔中 也有使用 Azure CLI 和 Azure PowerShell 的 快速入門。

將資料庫存取權授與 VM 有兩個步驟:

  1. 啟用伺服器的 Microsoft Entra 驗證。
  2. 在資料庫中建立 表示 VM 系統指派身分識別的自主使用者

啟用 Microsoft Entra 驗證

若要 設定 Microsoft Entra 驗證

  1. 在Azure 入口網站中,從左側導覽中選取 [SQL Server ]。
  2. 選取要針對 Microsoft Entra 驗證啟用的 SQL Server。
  3. 在刀鋒視窗的 [設定 ] 區段中,按一下 [ Active Directory 系統管理員 ]。
  4. 在命令列中,按一下 [ 設定系統管理員 ]。
  5. 選取要成為伺服器系統管理員的 Microsoft Entra 使用者帳戶,然後按一下 [ 選取]。
  6. 在命令列中,按一下 [ 儲存]。

建立自主使用者

本節說明如何在資料庫中建立內含的使用者,此使用者代表 VM 的系統指派身分識別。 針對此步驟,您需要 Microsoft SQL Server Management Studio (SSMS)。 在開始之前,檢閱下列文章以取得 Microsoft Entra 整合的背景可能很有説明:

SQL DB 需要唯一的 Microsoft Entra ID 顯示名稱。 如此一來,Microsoft Entra 帳戶,例如使用者、群組和服務主體(應用程式),以及針對受控識別啟用的 VM 名稱,必須針對其顯示名稱在 Microsoft Entra 識別碼中唯一定義。 SQL DB 會在 T-SQL 建立這類使用者期間檢查 Microsoft Entra ID 顯示名稱,如果不是唯一的,命令會失敗,要求為指定的帳號提供唯一的 Microsoft Entra ID 顯示名稱。

若要建立自主使用者:

  1. 啟動 SQL Server Management Studio。

  2. 在 [ 連線至伺服器] 對話方塊中,于 [伺服器 名稱] 欄位中輸入您的伺服器名稱

  3. 在 [驗證 ] 欄位中,選取 [ Active Directory - 通用與 MFA 支援 ]。

  4. 在 [ 使用者名稱] 欄位中,輸入您設定為伺服器管理員的 Microsoft Entra 帳戶名稱,例如 helen@woodgroveonline.com

  5. 按一下選項

  6. 在 [ 連線至資料庫 ] 欄位中,輸入您要設定的非系統資料庫名稱。

  7. 按一下 連線。 完成登入程式。

  8. 物件總管 中,展開 [ 資料庫] 資料夾。

  9. 以滑鼠右鍵按一下使用者資料庫,然後選取 [ 新增查詢 ]。

  10. 在查詢視窗中,輸入下列這一行,然後按一下工具列中的 [ 執行 ]:

    注意

    VMName 在下列命令中,是您在 prerequsites 區段中啟用系統指派身分識別的 VM 名稱。

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    此命令應該會順利完成,為 VM 的系統指派身分識別建立自主使用者。

  11. 清除查詢視窗,輸入下列這一行,然後按一下工具列中的 [ 執行 ]:

    注意

    VMName 在下列命令中,是您在必要條件區段中啟用系統指派身分識別的 VM 名稱。

    如果您遇到「主體 VMName 有重複的顯示名稱」錯誤,請將 CREATE USER 語句附加至 WITH OBJECT_ID='xxx'。

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    命令應該會順利完成,授與自主使用者讀取整個資料庫的能力。

在 VM 中執行的程式碼現在可以使用其系統指派的受控識別來取得權杖,並使用權杖向伺服器進行驗證。

存取資料

本節說明如何使用 VM 的系統指派受控識別來取得存取權杖,並用它來呼叫 Azure SQL。 Azure SQL 原生支援 Microsoft Entra 驗證,因此可以直接接受使用 Azure 資源的受控識別取得的存取權杖。 此方法不需要在連接字串上提供認證。

以下是使用 Active Directory 受控識別驗證開啟 SQL 連線的 .NET 程式碼範例。 程式碼必須在 VM 上執行,才能存取 VM 系統指派的受控識別端點。 若要使用此方法,需要 .NET Framework 4.6.2 或更高版本或 .NET Core 3.1 或更高版本。 請據以取代 AZURE-SQL-SERVERNAME 和 DATABASE 的值,並將 NuGet 參考新增至 Microsoft.Data.SqlClient 程式庫。

using Microsoft.Data.SqlClient;

try
{
//
// Open a connection to the server using Active Directory Managed Identity authentication.
//
string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>; Authentication=Active Directory Managed Identity; Encrypt=True";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();

注意

您可以使用受控識別,同時使用我們的 SDK 搭配其他程式設計選項。

或者,快速測試端對端設定的方式,而不需要在 VM 上撰寫和部署應用程式,就是使用 PowerShell。

  1. 在入口網站中,流覽至 [虛擬機器 ],然後移至您的 Windows 虛擬機器,然後在 [概觀] 中按一下 [連線 ]。

  2. 輸入 您在建立 Windows VM 時新增的 VM 系統管理員認證

  3. 既然您已使用虛擬機器建立 遠端桌面連線, 請在遠端會話中開啟 PowerShell

  4. 使用 PowerShell 的 Invoke-WebRequest ,向本機受控識別的端點提出要求,以取得 Azure SQL 的存取權杖。

        $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatabase.windows.net%2F' -Method GET -Headers @{Metadata="true"}
    

    將 JSON 物件的回應轉換為 PowerShell 物件。

    $content = $response.Content | ConvertFrom-Json
    

    從回應中擷取存取權杖。

    $AccessToken = $content.access_token
    
  5. 開啟與伺服器的連線。 請記得取代 AZURE-SQL-SERVERNAME 和 DATABASE 的值。

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source = <AZURE-SQL-SERVERNAME>; Initial Catalog = <DATABASE>; Encrypt=True;"
    $SqlConnection.AccessToken = $AccessToken
    $SqlConnection.Open()
    

    接下來,建立查詢,並將查詢傳送至伺服器。 請記得取代 TABLE 的值。

    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "SELECT * from <TABLE>;"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    

檢查 的值 $DataSet.Tables[0] 以檢視查詢的結果。

停用

若要停用 VM 上的系統指派身分識別,請將系統指派身分識別的狀態設定為 [關閉 ]。

Screenshot shows the System assigned tab for a virtual machine where you can turn off the System assigned status.

下一步

在本教學課程中,您已瞭解如何使用系統指派的受控識別來存取 Azure SQL 資料庫。 若要深入了解 Azure SQL Database,請參閱: