共用方式為


教學課程:使用 Windows VM/VMSS 存取 Azure 資源

Azure 資源受控識別是 Microsoft Entra ID 的一項功能。 每個支援適用於 Azure 資源的受控識別 Azure 服務均受限於其本身的時間表。 在開始之前,請務必先檢閱資源的受控識別可用性狀態和已知問題

必要條件

使用 Windows VM 系統指派的受控識別,來存取 Azure Data Lake Store

本教學課程說明如何將系統指派的受控識別用於 Windows 虛擬機器 (VM),以存取 Azure Data Lake Store。 受控身分識別由 Azure 自動管理。 這些受控識別讓您的應用程式能向支援 Microsoft Entra 驗證的服務進行驗證,而不需要將認證插入您的程式碼中。

在本文中,您將學會如何:

  • 將您的 VM 存取權授與 Azure Data Lake Store
  • 使用 VM 身分識別取得存取權杖,並使用它存取 Azure Data Lake Store

啟用

啟用系統指派的受控識別是單鍵體驗。 您可以在建立 VM 時或在現有 VM 的屬性中啟用此服務。

螢幕擷取畫面,顯示虛擬機器的系統指派索引標籤,您可以在其中開啟系統指派狀態。

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

  1. 登入 Azure 入口網站

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

授予存取權

您可以將您的 VM 存取權授與 Azure Data Lake Store 中的檔案和資料夾。 在這個步驟,您可以使用現有的 Data Lake Store 或建立新的。

若要使用 Azure 入口網站建立新的 Data Lake Store,請參閱 Azure Data Lake Store 快速入門。 在 Azure Data Lake Store 文件中也有使用 Azure CLI 和 Azure PowerShell 的快速入門作法。

在 Data Lake Store 中建立新資料夾,並授予 VM 系統指派的受控識別權限。 身分識別需要讀取、寫入和執行該資料夾中檔案的權限:

  1. 在 Azure 入口網站中,選取左方瀏覽列中的 [Data Lake Store]
  2. 選取您想要使用於本教學課程中的 Data Lake Store。
  3. 選取命令列中的 [資料總管]
  4. 會選取 Data Lake Store 的根資料夾。 在命令列中選取 [存取]
  5. 選取 [新增]。 在 [選取] 欄位中,輸入 VM 的名稱,例如 DevTestVM。 從搜尋結果中選取您的 VM,然後選取 [選取]
  6. 選取 [選取權限],然後選取 [讀取] 和 [執行]。 新增至 [此資料夾],然後選取 [僅限存取權限]
  7. 選取 [確定],然後關閉 [存取] 刀鋒視窗。 權限應該已成功加入。
  8. 接下來,建立新資料夾。 在命令列中選取 [新增資料夾],並指定新資料夾的名稱。 例如,TestFolder,然後選取 [確定]
  9. 選取您建立的資料夾,然後選取命令列中的 [存取]
  10. 選取 [新增],然後在 [選取] 欄位中輸入 VM 的名稱,然後選取 [選取]
  11. 選取 [選取權限],然後選取 [讀取]、[寫入] 和 [執行]。 新增至此資料夾,然後新增為存取權限項目和預設權限項目
  12. 選取 [確定]。 權限應該已成功加入。

VM 系統指派的受控識別現在可於您所建立的資料夾中,對檔案執行所有作業。 如需管理 Data Lake Store 存取權的相關資訊,請參閱 Data Lake Store 中的存取控制一文。

存取資料

Azure Data Lake Store 原生支援 Microsoft Entra 驗證,因此可直接接受使用 Azure 資源受控識別所取得的存取權杖。 為了向 Data Lake Store 檔案系統驗證,您在授權標頭中傳送由 Microsoft Entra AD 所簽發的存取權杖至 Data Lake Store 檔案系統端點。 標頭格式為 Bearer <ACCESS_TOKEN_VALUE>

若要深入了解 Data Lake Store 的 Microsoft Entra 驗證支援,請參閱使用 Microsoft Entra ID 向 Data Lake Store 進行驗證 (機器翻譯)。

注意

Data Lake Store 檔案系統用戶端 SDK 尚不支援適用於 Azure 資源的受控識別。

在本教學課程中,您使用 PowerShell 向 Data Lake Store 檔案系統 REST API 驗證,以提出 REST 要求。 若要使用 VM 系統指派的受控識別進行驗證,您需要從 VM 提出要求。

  1. 在入口網站中,瀏覽至 [虛擬機器],移至您的 Windows VM。 然後,在 [概觀] 中,選取 [連線]

  2. 輸入您建立 Windows VM 時新增的使用者名稱密碼

  3. 現在您已經建立 VM 的「遠端桌面連線」,請在遠端工作階段中開啟 PowerShell

  4. 使用 PowerShell Invoke-WebRequest Cmdlet,向 Azure 資源端點的本機受控識別提出要求,以取得 Azure Data Lake Store 的存取權杖。 Data Lake Store 的資源識別碼是 https://datalake.azure.net/。 Data Lake 會對資源識別碼執行完全相符的比對,因此結尾的斜線很重要。

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

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

    $content = $response.Content | ConvertFrom-Json
    

    擷取回應中的存取權杖。

    $AccessToken = $content.access_token
    
  5. 檢查所有項目皆正確設定。 使用 PowerShell Invoke-WebRequest Cmdlet 對您的 Data Lake Store REST 端點提出要求,以列出根資料夾中的資料夾。 授權標頭中的字串 Bearer 必須是大寫 “B”。 您可以在 Data Lake Store 的 [概觀] 區段中找到您的 Data Lake Store 名稱。

    Invoke-WebRequest -Uri https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/?op=LISTSTATUS -Headers @{Authorization="Bearer $AccessToken"}
    

    成功的回應看起來會像這樣:

    StatusCode        : 200
    StatusDescription : OK
    Content           : {"FileStatuses":{"FileStatus":[{"length":0,"pathSuffix":"TestFolder","type":"DIRECTORY", "blockSize":0,"accessTime":1507934941392, "modificationTime":1507944835699,"replication":0, "permission":"770","ow..."
    RawContent        : HTTP/1.1 200 OK
                        Pragma: no-cache
                        x-ms-request-id: b4b31e16-e968-46a1-879a-3474aa7d4528
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosniff
                        Strict-Transport-Security: ma...
    Forms             : {}
    Headers           : {[Pragma, no-cache], [x-ms-request-id, b4b31e16-e968-46a1-879a-3474aa7d4528],
                        [x-ms-webhdfs-version, 17.04.22.00], [Status, 0x0]...}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        : System.__ComObject
    RawContentLength  : 556
    
  6. 現在,請嘗試將檔案上傳至您的 Data Lake Store。 首先,建立要上傳的檔案。

    echo "Test file." > Test1.txt
    
  7. 使用 PowerShell Invoke-WebRequest Cmdlet 對您的 Data Lake Store REST 端點提出要求,以將檔案上傳到您先前建立的資料夾。 此要求分為兩個步驟。

    1. 提出要求,並重新導向至應上傳檔案的位置。
    2. 上傳 檔案。 如果您使用的資料夾和檔案名稱與本教學課程中指出的名稱的不同,請記得適當地設定這些值。
    $HdfsRedirectResponse = Invoke-WebRequest -Uri https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/TestFolder/Test1.txt?op=CREATE -Method PUT -Headers @{Authorization="Bearer $AccessToken"} -Infile Test1.txt -MaximumRedirection 0
    

    如果您檢查 $HdfsRedirectResponse 的值,它看起來應該像下列回應:

    PS C:\> $HdfsRedirectResponse
    
    StatusCode        : 307
    StatusDescription : Temporary Redirect
    Content           : {}
    RawContent        : HTTP/1.1 307 Temporary Redirect
                        Pragma: no-cache
                        x-ms-request-id: b7ab492f-b514-4483-aada-4aa0611d12b3
                        ContentLength: 0
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosn...
    Headers           : {[Pragma, no-cache], [x-ms-request-id, b7ab492f-b514-4483-aada-4aa0611d12b3], 
                        [ContentLength, 0], [x-ms-webhdfs-version, 17.04.22.00]...}
    RawContentLength  : 0
    

    將要求傳送至重新導向端點以完成上傳:

    Invoke-WebRequest -Uri $HdfsRedirectResponse.Headers.Location -Method PUT -Headers @{Authorization="Bearer $AccessToken"} -Infile Test1.txt -MaximumRedirection 0
    

    成功的回應看起來會像這樣:

    StatusCode        : 201
    StatusDescription : Created
    Content           : {}
    RawContent        : HTTP/1.1 201 Created
                        Pragma: no-cache
                        x-ms-request-id: 1e70f36f-ead1-4566-acfa-d0c3ec1e2307
                        ContentLength: 0
                        x-ms-webhdfs-version: 17.04.22.00
                        Status: 0x0
                        X-Content-Type-Options: nosniff
                        Strict...
    Headers           : {[Pragma, no-cache], [x-ms-request-id, 1e70f36f-ead1-4566-acfa-d0c3ec1e2307],
                        [ContentLength, 0], [x-ms-webhdfs-version, 17.04.22.00]...}
    RawContentLength  : 0
    

最後,您可以使用其他 Data Lake Store 檔案系統 API 來附加和下載檔案等等。

停用

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

螢幕擷取畫面,顯示虛擬機器的系統指派索引標籤,您可以在其中關閉系統指派狀態。

使用 Windows VM 系統指派的受控識別來存取 Azure 儲存體

本教學課程說明如何將系統指派的受控識別用於 Windows 虛擬機器 (VM),以存取 Azure 儲存體。 您將學習如何:

  • 在儲存體帳戶中建立 Blob 容器
  • 將 Windows VM 系統指派的受控識別存取權授與儲存體帳戶
  • 取得存取權,並用來呼叫 Azure 儲存體

啟用

啟用系統指派的受控識別是單鍵體驗。 您可以在建立 VM 時或在現有 VM 的屬性中啟用此服務。

螢幕擷取畫面,顯示虛擬機器的系統指派索引標籤,您可以在其中開啟系統指派狀態。

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

  1. 登入 Azure 入口網站

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

建立儲存體帳戶

在本節中,您會建立儲存體帳戶。

  1. 選取 Azure 入口網站左上角的 [+ 建立資源] 按鈕。

  2. 選取 [儲存體],然後按一下 [儲存體帳戶 - Blob、檔案、資料表、佇列]

  3. 在 [名稱] 欄位中,輸入儲存體帳戶的名稱。

  4. [部署模型] 和 [帳戶類型] 應該設定為資源管理員和儲存體 (一般用途 v1)

  5. 確定 [訂用帳戶] 和 [資源群組] 符合您在上一個步驟中建立 VM 時指定的值。

  6. 選取 建立

    螢幕擷取畫面,顯示如何建立新儲存體帳戶。

建立 Blob 容器,並將檔案上傳至儲存體帳戶

檔案需要 Blob 儲存體,因此您必須建立 Blob 容器,用來儲存檔案。 然後,您可以在新的儲存體帳戶中,將檔案上傳到 Blob 容器。

  1. 瀏覽到您新建立的儲存體帳戶。

  2. 在 [Blob 服務] 區段中,選取 [容器]

  3. 選取頁面頂端的 [+ 容器]

  4. 在 [新增容器] 欄位中,輸入容器的名稱,然後在 [公用存取層級] 選項中保留預設值。

    螢幕擷取畫面,顯示如何建立新的儲存體容器。

  5. 使用您選擇的編輯器,在本機電腦上建立標題為 hello world.txt 的檔案。 開啟檔案並新增 Hello world! 文字,然後儲存它。

  6. 選取容器名稱以將檔案上傳至新建立的容器,然後選取 [上傳]

  7. 在 [上傳 Blob] 窗格中的 [檔案] 區段中,選取資料夾圖示,然後瀏覽至本機電腦上的檔案 hello_world.txt。 然後依序選取檔案和 [上傳]螢幕擷取畫面,顯示文字檔上傳畫面。

授予存取權

本節將說明如何將您的 VM 存取權授與 Azure 儲存體容器。 您可以使用 VM 系統指派的受控識別,來擷取 Azure 儲存體 Blob 中的資料。

  1. 瀏覽到您新建立的儲存體帳戶。

  2. 選取 [存取控制 (IAM)]。

  3. 選取 [新增]> [新增角色指派],開啟 [新增角色指派] 頁面。

  4. 指派下列角色。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

    設定
    角色 儲存體 Blob 資料讀者
    存取權指派對象 受控識別
    系統指派 虛擬機器
    選取 <您的虛擬機器>

    螢幕擷取畫面,顯示新增角色指派的頁面。

存取資料

Azure 儲存體原生支援 Microsoft Entra 驗證,因此可直接接受使用受控識別取得的存取權杖。 此方法使用 Azure 儲存體與 Microsoft Entra ID 的整合,與在連接字串上提供認證不同。

以下是開啟與 Azure 儲存體連線的 .NET 程式碼範例。 範例會使用存取權杖,然後讀取您稍早建立的檔案內容。 此程式碼必須在 VM 上執行,才能夠存取 VM 的受控識別端點。 必須要有 .NET Framework 4.6 或更新版本,才能使用存取權杖方法。 據以取代 <URI to blob file> 的值。 您可以瀏覽至您建立並上傳至 Blob 儲存體的檔案,並複製 [概觀] 頁面 [屬性] 下的 [URL],即可取得此值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace StorageOAuthToken
{
    class Program
    {
        static void Main(string[] args)
        {
            //get token
            string accessToken = GetMSIToken("https://storage.azure.com/");

            //create token credential
            TokenCredential tokenCredential = new TokenCredential(accessToken);

            //create storage credentials
            StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

            Uri blobAddress = new Uri("<URI to blob file>");

            //create block blob using storage credentials
            CloudBlockBlob blob = new CloudBlockBlob(blobAddress, storageCredentials);

            //retrieve blob contents
            Console.WriteLine(blob.DownloadText());
            Console.ReadLine();
        }

        static string GetMSIToken(string resourceID)
        {
            string accessToken = string.Empty;
            // Build request to acquire MSI token
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=" + resourceID);
            request.Headers["Metadata"] = "true";
            request.Method = "GET";

            try
            {
                // Call /token endpoint
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Pipe response Stream to a StreamReader, and extract access token
                StreamReader streamResponse = new StreamReader(response.GetResponseStream());
                string stringResponse = streamResponse.ReadToEnd();
                JavaScriptSerializer j = new JavaScriptSerializer();
                Dictionary<string, string> list = (Dictionary<string, string>)j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
                accessToken = list["access_token"];
                return accessToken;
            }
            catch (Exception e)
            {
                string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
                return accessToken;
            }
        }
    }
}

回應會包含檔案的內容:

Hello world! :)

停用

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

螢幕擷取畫面,顯示虛擬機器的系統指派索引標籤,您可以在其中關閉系統指派狀態。

使用 Windows VM 系統指派的受控識別,透過 SAS 認證來存取 Azure 儲存體

本教學課程說明如何將系統指派的身分識別用於 Windows 虛擬機器 (VM),以取得儲存體共用存取簽章 (SAS) 認證。

服務 SAS 可以針對時間限制和特定服務 (在此案例中為 Blob 服務) 授與有限的存取權限,以供使用儲存體帳戶內的物件。 SAS 不需公開帳戶存取金鑰即可執行此工作。 針對儲存體作業 (例如使用儲存體 SDK 時),您可以如往常般使用 SAS 認證。 此教學課程會示範使用 Azure 儲存體 PowerShell 上傳和下載 Blob。

您將學習如何:

  • 建立儲存體帳戶
  • 在資源管理員中將 VM 存取權限授與儲存體帳戶 SAS
  • 使用 VM 身分識別取得存取權杖,並將其用於從資源管理員取出 SAS

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

建立儲存體帳戶

如果您還沒有儲存體帳戶,則必須建立儲存體帳戶。 否則,請遵循這些步驟,將存取現有儲存體帳戶 SAS 認證的權利,授與 VM 系統指派的受控識別。

  1. 選取 [儲存體],然後選取 [儲存體帳戶]

  2. 在 [建立儲存體帳戶] 面板中,輸入儲存體帳戶的名稱。

  3. 請確定 [部署模型] 和 [帳戶種類] 設定為 [Resource Manager] 和 [一般用途]

  4. 檢查以確定 [訂用帳戶] 和 [資源群組] 符合您在上一個步驟中建立 VM 時指定的項目。

  5. 選取 [建立] 以建立儲存體帳戶。

    螢幕擷取畫面,顯示如何建立新儲存體帳戶。

在儲存體帳戶中建立 Blob 容器

稍後在本教學課程中,您將上傳檔案並將其下載到新的儲存體帳戶。 由於檔案需要 Blob 儲存體,您需要建立 Blob 容器,用來儲存檔案。

  1. 瀏覽到您新建立的儲存體帳戶。

  2. 選取左側面板 [Blob 服務] 下的 [容器] 連結。

  3. 選取頁面頂端的 [+ 容器],然後應該會出現 [新增容器] 面板。

  4. 為容器指定名稱、判斷存取層級,然後選取 [確定]。 您在此指定的名稱稍後會在教學課程中使用。

    螢幕擷取畫面,顯示如何建立新的儲存體容器。

將存取儲存體帳戶 SAS 的權利,授予 VM 系統指派的受控識別

Azure 儲存體原本不支援 Microsoft Entra 驗證。 不過,您可以使用受控識別從 Resource Manager 擷取儲存體 SAS,然後使用該 SAS 存取儲存體。 在此步驟中,您會將存取儲存體帳戶 SAS 的權利,授予 VM 系統指派的受控識別。

  1. 巡覽回到您新建立的儲存體帳戶。

  2. 選取 [存取控制 (IAM)]。

  3. 選取 [新增]> [新增角色指派],開啟 [新增角色指派] 頁面。

  4. 指派下列角色。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

    設定
    角色 儲存體帳戶參與者
    存取權指派對象 受控識別
    系統指派 虛擬機器
    選取 <您的 Windows 虛擬機器>

    螢幕擷取畫面,顯示新增角色指派的頁面。

使用 VM 的身分識別取得存取權杖,並使用它來呼叫 Azure Resource Manager

在本教學課程的其餘部分,您會從 VM 工作。 在這部分的課程中,需要用到 Azure Resource Manager PowerShell Cmdlet。 如果您沒有安裝 PowerShell,請下載最新版本之後再繼續。

  1. 在 Azure 入口網站中,瀏覽至 [虛擬機器],移至您的 Windows 虛擬機器,然後在 [概觀] 頁面中,選取頂端的 [連線]

  2. 輸入您在建立 Windows VM 時新增的使用者名稱密碼

  3. 建立與虛擬機器的遠端桌面連線

  4. 在遠端工作階段中開啟 PowerShell,然後使用 PowerShell Invoke-WebRequest Cmdlet,向 Azure 資源端點的本機受控識別提出要求,以取得 Azure Resource Manager 的權杖。

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

    注意

    resource 參數的值必須完全符合 Microsoft Entra ID 的預期。 當使用 Azure Resource Manager 資源 ID 時,必須在 URI 中包含結尾的斜線。

    接下來,擷取 content 元素,該元素會儲存為 $response 物件中的 JavaScript 物件標記法 (JSON) 格式字串。

    $content = $response.Content | ConvertFrom-Json
    

    再來,從回應中擷取存取權杖。

    $ArmToken = $content.access_token
    

從 Azure Resource Manager 取得 SAS 認證以進行儲存體呼叫

最後,使用 PowerShell 使用您在上一節中擷取的存取權杖來呼叫 Resource Manager。 您可以使用此權杖來建立儲存體 SAS 認證。 擁有 SAS 認證之後,您可以呼叫其他儲存體作業。

針對此要求,我們會使用下列 HTTP 要求參數來建立 SAS 認證:

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite. Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

要求 SAS 認證的 POST 主體中包含了此處的參數。 如需有關建立 SAS 認證參數的詳細資訊,請參閱清單服務 SAS REST 參考

  1. 將參數轉換為 JSON,然後呼叫儲存體 listServiceSas 端點以建立 SAS 認證:

    $params = @{canonicalizedResource="/blob/<STORAGE-ACCOUNT-NAME>/<CONTAINER-NAME>";signedResource="c";signedPermission="rcw";signedProtocol="https";signedExpiry="2017-09-23T00:00:00Z"}
    $jsonParams = $params | ConvertTo-Json
    
    $sasResponse = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE-ACCOUNT-NAME>/listServiceSas/?api-version=2017-06-01 -Method POST -Body $jsonParams -Headers @{Authorization="Bearer $ArmToken"}
    

    注意

    URL 區分大小寫,因此請確定您使用的是命名資源群組時,您所使用的相同大小寫,而且 resourceGroups 中的 "G" 為大寫。

  2. 接下來,從回應中擷取 SAS 認證:

    $sasContent = $sasResponse.Content | ConvertFrom-Json
    $sasCred = $sasContent.serviceSasToken
    
  3. 如果您檢查 SAS 認證,您應該會看到類似如下的內容:

    PS C:\> $sasCred
    sv=2015-04-05&sr=c&spr=https&se=2017-09-23T00%3A00%3A00Z&sp=rcw&sig=JVhIWG48nmxqhTIuN0uiFBppdzhwHdehdYan1W%2F4O0E%3D
    
  4. 建立一個名為 test.txt 的檔案。 然後使用 SAS 認證,以 New-AzStorageContent Cmdlet 進行驗證,並將檔案上傳至 Blob 容器,然後下載該檔案。

    echo "This is a test text file." > test.txt
    
  5. 請務必先使用 Install-Module Azure.Storage 安裝 Azure 儲存體 Cmdlet。 然後使用 PowerShell Set-AzStorageBlobContent Cmdlet 上傳您剛才建立的 Blob:

    $ctx = New-AzStorageContext -StorageAccountName <STORAGE-ACCOUNT-NAME> -SasToken $sasCred
    Set-AzStorageBlobContent -File test.txt -Container <CONTAINER-NAME> -Blob testblob -Context $ctx
    

    回應:

    ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
    BlobType          : BlockBlob
    Length            : 56
    ContentType       : application/octet-stream
    LastModified      : 9/21/2017 6:14:25 PM +00:00
    SnapshotTime      :
    ContinuationToken :
    Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
    Name              : testblob
    
  6. 您也可以使用 Get-AzStorageBlobContent PowerShell Cmdlet 來下載您上傳的 Blob:

    Get-AzStorageBlobContent -Blob testblob -Container <CONTAINER-NAME> -Destination test2.txt -Context $ctx
    

    回應:

    ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
    BlobType          : BlockBlob
    Length            : 56
    ContentType       : application/octet-stream
    LastModified      : 9/21/2017 6:14:25 PM +00:00
    SnapshotTime      :
    ContinuationToken :
    Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
    Name              : testblob
    

使用 Windows VM 系統指派的受控識別來存取 Azure SQL Database

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

您將學習如何:

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

啟用

啟用系統指派的受控識別是單鍵體驗。 您可以在建立 VM 時或在現有 VM 的屬性中啟用此服務。

螢幕擷取畫面,顯示虛擬機器的系統指派索引標籤,您可以在其中開啟系統指派狀態。

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

  1. 登入 Azure 入口網站

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

授予存取權

若要為 Azure SQL Database 中的資料庫授與您的 VM 存取權,請使用現有的邏輯 SQL 伺服器,或建立新的伺服器。 若要使用 Azure 入口網站建立新的伺服器和資料庫,請遵循 Azure SQL 快速入門的作法。 在 Azure SQL 文件中也有使用 Azure CLI 和 Azure PowerShell 的快速入門作法。

請遵循下列步驟,將您的 VM 存取權授與資料庫:

  1. 啟用適用於伺服器的 Microsoft Entra 驗證。
  2. 在資料庫中建立內含的使用者,以代表 VM 系統指派的身分識別。

啟用 Microsoft Entra 驗證

若要設定 Microsoft Entra 驗證

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

建立內含的使用者

本節將說明如何在資料庫中建立內含的使用者,以代表 VM 系統指派的身分識別。 在此步驟中,您需要安裝 Microsoft SQL Server Management Studio (SSMS)。 在開始之前,先檢閱以下文章了解 Microsoft Entra 整合的背景會很有幫助:

SQL 資料庫需要唯一 Microsoft Entra ID 顯示名稱。 因此,使用者、群組和服務主體 (應用程式) 之類的 Microsoft Entra 帳戶和針對受控識別啟用的 VM 名稱,在 Microsoft Entra ID 中都必須是唯一定義且專屬於其對應的顯示名稱。 SQL 會在 T-SQL 建立此類使用者期間,檢查 Microsoft Entra ID 顯示名稱。 如果顯示名稱不是唯一的,則命令會失敗,並提示您為每個指定的帳戶提供唯一的 Microsoft Entra ID 顯示名稱。

若要建立內含的使用者

  1. 開啟 [SQL Server Management Studio] 。

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

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

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

  5. 選取選項

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

  7. 選取 [連線],然後完成登入程序。

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

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

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

    注意

    下列命令中的 VMName 是在必要條件一節中已將系統指派的身分識別啟用的 VM 名稱。

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

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

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

    注意

    下列命令中的 VMName 是在必要條件一節中已將系統指派的身分識別啟用的 VM 名稱。

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

    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 時,您可以使用受控識別來處理其他程式設計選項。

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

  1. 在入口網站中,瀏覽至 [虛擬機器]、移至您的 Windows VM,然後在 [概觀] 中選取 [連線]

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

  3. 現在您已經建立 VM 的「遠端桌面連線」,請在遠端工作階段中開啟 PowerShell

  4. 使用 PowerShell Invoke-WebRequest Cmdlet,向本機受控識別的端點提出要求,以取得 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 上停用系統指派的身分識別,請將系統所指派身分識別的狀態設定為 [關閉]

螢幕擷取畫面,顯示虛擬機器的系統指派索引標籤,您可以在其中關閉系統指派狀態。

使用 Windows VM 系統指派的受控識別來存取 Azure Key Vault

本教學課程說明 Windows 虛擬機器 (VM) 可以如何使用系統指派的受控識別,以存取 Azure Key Vault。 金鑰保存庫讓您的用戶端應用程式能夠使用祕密來存取未受 Microsoft Entra ID 保護的資源。 受控身分識別由 Azure 自動管理。 其可讓您驗證支援 Microsoft Entra 驗證的服務,而不需要將驗證資訊包含在您的程式碼中。

您將學習如何:

  • 授與 VM 存取權以取得 Key Vault 中的密碼
  • 使用 VM 身分識別取得存取權杖,並使用它來擷取 Key Vault 的祕密

建立金鑰保存庫

提示

根據您開始使用的入口網站,本文中的步驟可能略有不同。

本節將說明如何授與 VM 存取權以取得 Key Vault 中的祕密。 當您使用 Azure 資源受控識別時,您的程式碼可以取得存取權杖,以向支援 Microsoft Entra 驗證的資源進行驗證。 

但是,並非所有 Azure 服務都支援 Microsoft Entra 驗證。 若要使用適用於 Azure 資源的受控識別搭配那些服務,請將服務認證儲存在 Azure Key Vault 中,並使用 VM 的受控識別來存取 Key Vault,以擷取認證。

首先,您需要建立 Key Vault,並將存取 Key Vault 的權利授與 VM 系統指派的受控識別。

  1. 登入 Azure 入口網站

  2. 在左側導覽列的頂端,選取 [建立資源]

  3. 在 [搜尋 Marketplace] 方塊中輸入 Key Vault 然後按 Enter 鍵。

  4. 從結果中選取 [Key Vault],然後選取 [建立]

  5. 提供新 Key Vault 的名稱

    [建立 Key Vault] 畫面的螢幕擷取畫面。

  6. 填寫所有必要資訊。 請確定您選擇要用於本教學課程的訂用帳戶和資源群組。

  7. 選取 [檢閱 + 建立]

  8. 選取 建立

建立祕密

接下來,您需要將祕密新增至 Key Vault,好讓您稍後可以使用在 VM 中執行的程式碼來擷取祕密。 在本節中,您會使用 PowerShell,但相同的概念適用於您在 VM 中執行的任何程式碼。

  1. 瀏覽到您新建立的 Key Vault。

  2. 選取 [祕密],然後選取 [新增]

  3. 選取產生/匯入

  4. 從 [建立祕密] 畫面的 [上傳選項] 中,保持選取 [手動]

  5. 輸入密碼的名稱和值。 值可以是任何您想要的項目。 

  6. 將啟動日期和到期日期保留空白,並將 [啟用] 設定為 [是]。 

  7. 選取 [建立] 來建立祕密。

    顯示如何建立祕密的螢幕擷取畫面。

授予存取權

VM 所使用的受控識別必須獲得存取權,才能讀取 Key Vault 所儲存的祕密。

  1. 瀏覽到您新建立的 Key Vault。

  2. 從左側的功能表中選取 [存取原則]

  3. 選取新增存取原則

    顯示 Key Vault 存取原則畫面的螢幕擷取畫面。

  4. 在 [新增存取原則] 區段的 [從範本設定 (選用)] 下,從下拉式功能表中選擇 [祕密管理]

  5. 選擇 [選取主體],然後在 [搜尋] 欄位中輸入您稍早建立的 VM 名稱。 

  6. 在結果清單中選取 VM,然後選擇 [選取]

  7. 選取 [新增]。

  8. 選取 [儲存]。

存取資料

本節將說明如何使用 VM 身分識別取得存取權杖,並用其來擷取 Key Vault 的密碼。 如果您未安裝 PowerShell 4.3.1 或更新版本,則必須下載並安裝最新版

注意

使用 PowerShell 來驗證和擷取祕密的方法,在特別需要受控識別的案例中,或在應用程式程式碼中內嵌程續時,是慣用的方法。

首先,使用 VM 系統指派的受控識別來取得存取權杖,以向 Key Vault 進行驗證:

  1. 在入口網站中,瀏覽至 [虛擬機器],然後移至您的 Windows VM,然後在 [概觀] 中選取 [連線]
  2. 輸入您建立 Windows VM 時新增的使用者名稱密碼
  3. 現在您已經建立 VM 的「遠端桌面連線」,請在遠端工作階段中開啟 PowerShell。
  4. 在 PowerShell 中,叫用租用戶上的 Web 要求,以在 VM 的特定連接埠中取得本機主機的權杖。

注意

如果使用主權雲端,例如 GCC-H,請使用端點 vault.usgovcloudapi.net,而不是在 PowerShell Cmdlet 中的 vault.azure.net

PowerShell 要求範例:

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

注意

使用主權雲時,您需要對 Cmdlet 結尾所指定的端點進行調整。

例如,vault.usgovcloudapi.net 在使用 Azure Government Cloud 時應該使用,而這就是最終結果:

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

若要確認尾碼符合您的環境,請檢閱 Azure Key Vault 安全性概觀一文。

回應看起來應如下所示:

顯示具有權杖回應的要求的螢幕擷取畫面。

再來,從回應中擷取存取權杖。

   $KeyVaultToken = $Response.access_token

最後,使用 PowerShell Invoke-WebRequest Cmdlet 來擷取您稍早在 Key Vault 中建立的祕密,在授權標頭中傳遞存取權杖。 您會需要 Key Vault 的 URL,其位於 Key Vault [概觀] 頁面的 [基本資訊] 區段。

Invoke-RestMethod -Uri https://<your-key-vault-URL>/secrets/<secret-name>?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $KeyVaultToken"}

回應應該如下所示:

  value       id                                                                                    attributes
  -----       --                                                                                    ----------
  'My Secret' https://mi-lab-vault.vault.azure.net/secrets/mi-test/50644e90b13249b584c44b9f712f2e51 @{enabled=True; created=16…

一旦您已從 Key Vault 擷取密碼,您便可以將其用來向需要名稱和密碼的服務進行驗證。

清除資源

最後,當您想要清除資源時,請登入 Azure 入口網站,選取 [資源群組],然後找到並選取在本教學課程的程序中建立的資源群組 (例如 mi-test)。 然後使用 Delete resource group 命令。

或者,您也可以使用 PowerShell 或 CLI 來清除資源。

使用 Windows VM 系統指派的受控識別來存取 Resource Manager

提示

根據您開始使用的入口網站,本文中的步驟可能略有不同。

本教學課程說明如何建立系統指派的身分識別,並將其指派給 Windows 虛擬機器 (VM),然後使用該身分識別來存取 Azure Resource Manager API。 由 Azure 自動管理受控服務身分識別。 它們會啟用對支援 Microsoft Entra 驗證之服務的驗證,而不需要在程式碼中內嵌認證。

您將學習如何:

  • 將您的 VM 存取權授與 Azure Resource Manager。
  • 使用 VM 系統指派的受控識別取得存取權杖,以存取 Resource Manager。
  1. 使用系統管理員帳戶登入 Azure 入口網站

  2. 瀏覽至 [資源群組] 索引標籤。

  3. 選取您想要授與 VM 受控識別存取權的資源群組

  4. 從左側面板中,選取 [存取控制 (IAM)]

  5. 選取 [新增],然後選取 [新增角色指派]

  6. 在 [角色] 索引標籤中,選取 [讀者]。 此角色可以檢視所有資源,但無法進行任何變更。

  7. 在 [成員] 索引標籤的 [存取權指派對象為] 選項中,選取 [受控識別],然後選取 [+ 選取成員]

  8. 確認 [訂用帳戶] 下拉式清單中已列出適當的訂用帳戶。 針對 [資源群組],請選取 [所有資源群組]

  9. 針對 [管理身分識別] 下拉式清單,選取 [虛擬機器]

  10. 針對 [選取],選擇下拉式清單中的 VM,然後選取 [儲存]

    顯示將讀者角色新增至受控識別的螢幕擷取畫面。

取得存取權杖

使用 VM 系統指派的受控識別,並呼叫 Resource Manager 以取得存取權杖。

若要完成這些步驟,您需要 SSH 用戶端。 如果您使用 Windows,您可以在 Windows 子系統 Linux 版中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組

  1. 在入口網站中,瀏覽至您的 Linux VM,然後在 [概觀] 中選取 [連線]
  2. 使用您所選擇的 SSH 用戶端來連線到 VM。
  3. 在終端機視窗中,使用 curl 向本機 Azure 資源受控識別端點提出要求,以取得 Azure Resource Manager 的存取權杖。   存取權杖的 curl 要求如下。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true

注意

resource 參數的值必須完全符合 Microsoft Entra ID 的預期。 當使用 Resource Manager 資源 ID 時,必須在 URI 中包含結尾的斜線。

此回應包含您存取 Azure Resource Manager 所需的存取權杖。

回應:

{
  "access_token":"eyJ0eXAiOi...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.azure.com",
  "token_type":"Bearer"
}

使用此存取權杖來存取 Azure Resource Manager,例如讀取您先前授與此 VM 存取的資源群組詳細資料。 使用您稍早建立的值來取代 <SUBSCRIPTION-ID><RESOURCE-GROUP><ACCESS-TOKEN>

注意

URL 區分大小寫,因此請確定您使用的是稍早在命名資源群組時所使用的相同大小寫,而且 “resourceGroup” 中的 “G” 為大寫。

curl https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS-TOKEN>" 

傳回的回應含有特定的資源群組資訊:

{
"id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/DevTest",
"name":"DevTest",
"location":"westus",
"properties":
{
  "provisioningState":"Succeeded"
  }
} 

在 Windows VM 上利用使用者指派的受控識別來存取 Azure Resource Manager

本教學課程說明如何建立使用者指派的身分識別,並將其指派給 Windows 虛擬機器 (VM),然後使用該身分識別來存取 Azure Resource Manager API。 由 Azure 自動管理受控服務身分識別。 它們會啟用對支援 Microsoft Entra 驗證之服務的驗證,而不需要在程式碼中內嵌認證。

您將學習如何:

  • 建立使用者指派的受控識別
  • 將使用者指派的身分識別指派給 Windows VM
  • 在 Azure Resource Manager 中,將存取資源群組的權利,授予使用者指派的身分識別
  • 利用使用者指派的身分識別來取得存取權杖,以用來呼叫 Azure Resource Manager
  • 讀取資源群組的屬性

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

在本機設定 Azure PowerShell

若要在此範例中執行指令碼,您有兩個選項:

  • 使用 Azure Cloud Shell,您可以使用程式碼區塊右上角的 [試用] 按鈕來開啟此服務。
  • 使用 Azure PowerShell 在本機執行指令碼,如下一節所述。

若要針對本教學課程在本機使用 Azure PowerShell (而不是使用 Cloud Shell),請完成下列步驟:

  1. 如果您尚未安裝最新版的 Azure PowerShell,請先安裝。

  2. 登入 Azure:

    Connect-AzAccount
    
  3. 安裝最新版的 PowerShellGet

    Install-Module -Name PowerShellGet -AllowPrerelease
    

    您必須在針對下一個步驟執行此命令之後,Exit 目前的 PowerShell 工作階段。

  4. 安裝已發行的 Az.ManagedServiceIdentity 模組版本。 您需要此項目才能執行本教學課程中使用者指派的受控識別作業:

    Install-Module -Name Az.ManagedServiceIdentity -AllowPrerelease
    

啟用

針對以使用者指派身分識別為基礎的案例,您需要執行本節中的下列步驟:

  1. 建立身分識別。
  2. 指派新建立的身分識別。

建立身分識別

本節說明如何建立使用者指派的身分識別,此身分識別會建立為獨立 Azure 資源。 使用 New-AzUserAssignedIdentity Cmdlet,Azure 會在您Microsoft Entra 租用戶中建立身分識別,而您可以指派給一或多個 Azure 服務執行個體。

重要

建立使用者指派的受控識別時,名稱必須以字母或數字開頭,並且包含英數字元、連字號 (-) 和底線 (_) 的組合。 若要讓虛擬機器或虛擬機器擴展集的指派正常運作,名稱長度上限為 24 個字元。 如需詳細資訊,請參閱常見問題集和已知問題

New-AzUserAssignedIdentity -ResourceGroupName myResourceGroupVM -Name ID1

回應包含使用者指派的身分識別建立之後的詳細資料,與下列範例類似。 針對使用者指派的身分識別定義 IdClientId 值,因為後續步驟會用到這些值:

{
Id: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1
ResourceGroupName : myResourceGroupVM
Name: ID1
Location: westus
TenantId: aaaabbbb-0000-cccc-1111-dddd2222eeee
PrincipalId: aaaaaaaa-bbbb-cccc-1111-222222222222
ClientId: 00001111-aaaa-2222-bbbb-3333cccc4444
ClientSecretUrl: https://control-westus.identity.azure.net/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1/credentials?tid=aaaabbbb-0000-cccc-1111-dddd2222eeee&oid=aaaaaaaa-bbbb-cccc-1111-222222222222&aid=00001111-aaaa-2222-bbbb-3333cccc4444
Type: Microsoft.ManagedIdentity/userAssignedIdentities
}

指派身分識別

本節將說明如何將使用者指派的身分識別指派給 Windows VM。 使用者指派的身分識別可以由多個 Azure 資源上的用戶端使用。 請使用下列命令,將使用者指派的身分識別指派給單一虛擬機器。 針對 -IdentityID 參數,請使用前一個步驟中所傳回的 Id 屬性。

$vm = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
Update-AzVM -ResourceGroupName TestRG -VM $vm -IdentityType "UserAssigned" -IdentityID "/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ID1"

授予存取權

本節將說明如何在 Azure Resource Manager 中,將存取資源群組的權利,授與使用者指派的身分識別。 適用於 Azure 資源的受控識別會提供身分識別,可供程式碼用來要求存取權杖,以向支援 Microsoft Entra 驗證的資源 API 進行驗證。 在本教學課程中,您的程式碼將存取 Azure Resource Manager API。

您必須先將身分識別存取權授與 Azure Resource Manager 中的資源,您的程式碼才能存取 API。 在此情況下,您會存取包含 VM 的資源群組。 將 <SUBSCRIPTIONID> 的值更新為適用於環境的值。

$spID = (Get-AzUserAssignedIdentity -ResourceGroupName myResourceGroupVM -Name ID1).principalid
New-AzRoleAssignment -ObjectId $spID -RoleDefinitionName "Reader" -Scope "/subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/"

回應會包含已建立的角色指派詳細資料,與下列範例類似:

RoleAssignmentId: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000
Scope: /subscriptions/<SUBSCRIPTIONID>/resourcegroups/myResourceGroupVM
DisplayName: ID1
SignInName:
RoleDefinitionName: Reader
RoleDefinitionId: 00000000-0000-0000-0000-000000000000
ObjectId: aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
ObjectType: ServicePrincipal
CanDelegate: False

存取資料

提示

根據您開始使用的入口網站,本文中的步驟可能略有不同。

取得存取權杖

其餘教學課程要從稍早建立的 VM 繼續進行。

  1. 登入 Azure 入口網站

  2. 在入口網站中,瀏覽至 [虛擬機器],然後移至 Windows VM。 在 [概觀] 中,選取 [連線]

  3. 輸入您建立 Windows VM 時使用的使用者名稱密碼

  4. 現在您已經建立 VM 的「遠端桌面連線」,請在遠端工作階段中開啟 PowerShell

  5. 使用 PowerShell Invoke-WebRequest Cmdlet,向 Azure 資源端點的本機受控識別提出要求,以取得 Azure Resource Manager 的存取權杖。 client_id 值就是您在建立使用者指派受控識別時所傳回的值。

    $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}
    $content = $response.Content | ConvertFrom-Json
    $ArmToken = $content.access_token
    

讀取屬性

最後,使用在先前步驟中所擷取的存取權杖來存取 Azure Resource Manager,然後讀取資源群組的屬性 (您已向使用者指派的身分識別授與該資源群組的存取權)。 將 <SUBSCRIPTION ID> 取代為您環境的訂用帳戶識別碼。

(Invoke-WebRequest -Uri https://management.azure.com/subscriptions/80c696ff-5efa-4909-a64d-f1b616f423ca/resourceGroups/myResourceGroupVM?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{Authorization ="Bearer $ArmToken"}).content

回應包含特定資源群組資訊,與下列範例類似:

{"id":"/subscriptions/<SUBSCRIPTIONID>/resourceGroups/myResourceGroupVM","name":"myResourceGroupVM","location":"eastus","properties":{"provisioningState":"Succeeded"}}

深入了解