共用方式為


教學課程:使用 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 或建立新的 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 標識碼所發出的存取令牌傳送至授權標頭中的 Data Lake Store 檔案系統端點。 標頭格式 Bearer <ACCESS_TOKEN_VALUE>為 。

若要深入瞭解 Data Lake Store 對 Microsoft Entra 驗證的支援,請參閱 使用 Microsoft Entra 標識符向 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. 部署模型帳戶種類應設定為 Resource Manager記憶體(一般用途 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 識別碼的整合,而且與在 連接字串 上提供認證不同。

以下是開啟連線至 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 虛擬機的系統指派身分識別來取得記憶體 共用存取簽章 (SAS) 認證。

服務 SAS 可讓您將有限的存取權授與記憶體帳戶中物件的有限存取權,以及特定服務(在此案例中為 Blob 服務)。 SAS 不公開帳戶存取金鑰即可執行此工作。 您可以像往常一樣使用 SAS 認證來進行記憶體作業;例如,使用記憶體 SDK 時。 本教學課程示範如何使用PowerShell Azure 儲存體上傳和下載 Blob。

您將學習如何:

  • 建立儲存體帳戶
  • 在 Resource Manager 中將記憶體帳戶 SAS 的存取權授與 VM
  • 使用 VM 的身分識別取得存取令牌,並使用它從 Resource Manager 擷取 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. 為容器指定名稱、判斷存取層級,然後選取 [ 確定]。 您在此指定的名稱稍後會在教學課程中使用。

    顯示如何建立記憶體容器的螢幕快照。

授與 VM 系統指派的受控識別存取權,以使用記憶體 SAS

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

  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 資源識別碼時,您必須在 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 認證向 Cmdlet 進行驗證 New-AzStorageContent 、將檔案上傳至 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. 您也可以使用 PowerShell Cmdlet 下載您上傳的 Get-AzStorageBlobContent 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 資料庫

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

您將學習如何:

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

啟用

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

此螢幕快照顯示虛擬機的 [系統指派] 索引標籤,您可以在其中開啟系統指派的狀態。

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

  1. 登入 Azure 入口網站

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

授予存取權

若要將 VM 存取權授與 Azure SQL 資料庫 中的資料庫,請使用現有的邏輯 SQL Server 或建立新的 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 資料庫需要唯一Microsoft Entra ID 顯示名稱。 如此一來,Microsoft Entra 帳戶,例如使用者、群組和服務主體(應用程式),以及針對受控識別啟用的 VM 名稱,必須唯一定義在其對應顯示名稱特定的Microsoft Entra 標識符中。 SQL 會在 T-SQL 建立這類用戶期間,檢查Microsoft Entra ID 顯示名稱。 如果顯示名稱不是唯一的,命令會失敗,並提示您為每個指定的帳戶提供唯一的Microsoft Entra ID 顯示名稱。

建立自主使用者

  1. 開啟 [SQL Server Management Studio] 。

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

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

  4. 在 [ 使用者名稱] 欄位中,輸入您設定為伺服器管理員的 Microsoft Entra 帳戶名稱,例如 cjensen@fabrikam.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 搭配其他程式設計選項。

或者,使用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 金鑰保存庫

本教學課程說明 Windows 虛擬機 (VM) 如何使用系統指派的受控識別來存取 Azure 金鑰保存庫。 金鑰保存庫 可讓您的用戶端應用程式使用秘密來存取不受Microsoft Entra標識符保護的資源。 受控識別會自動由 Azure 管理。 它們可讓您向支援 Microsoft Entra 驗證的服務進行驗證,而不需要在您的程式代碼中包含驗證資訊。

您將學習如何:

  • 將您的 VM 存取權授與儲存在 金鑰保存庫 中的秘密
  • 使用 VM 身分識別取得存取令牌,並使用它從 金鑰保存庫 擷取秘密

建立 金鑰保存庫

提示

本文中的步驟可能會根據您從開始的入口網站稍有不同。

本節說明如何將 VM 存取權授與儲存在 金鑰保存庫 中的秘密。 當您針對 Azure 資源使用受控識別時,您的程式代碼可以取得存取令牌,以向支援Microsoft Entra 驗證的資源進行驗證。 

不過,並非所有 Azure 服務都支援Microsoft Entra 驗證。 若要搭配這些服務使用 Azure 資源的受控識別,請將服務認證儲存在 Azure 金鑰保存庫,並使用 VM 的受控識別來存取 金鑰保存庫 來擷取認證。

首先,您必須建立 金鑰保存庫,並將 VM 系統指派的受控識別存取權授與 金鑰保存庫。

  1. 登入 Azure 入口網站

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

  3. 在 [搜尋 Marketplace] 方塊中,輸入 金鑰保存庫,然後按 Enter

  4. 從結果中選取 [金鑰保存庫],然後選取 [建立]。

  5. 提供新金鑰保存庫的名稱。

    [建立金鑰保存庫] 畫面的螢幕快照。

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

  7. 選取 [ 檢閱+ 建立]。

  8. 選取 建立

建立祕密

接下來,您必須將秘密新增至 金鑰保存庫,以便稍後使用在 VM 中執行的程式代碼來擷取密碼。 在本節中,您會使用 PowerShell,但相同的概念適用於您在 VM 中執行的任何程序代碼。

  1. 流覽至新建立的 金鑰保存庫。

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

  3. 選取產生/匯入

  4. 在 [ 建立秘密 ] 畫面中,於 [上傳選項 ] 中保留 [ 手動 ] 選取狀態。

  5. 輸入秘密的名稱和值。 此值可以是您想要的任何專案。 

  6. 讓啟用日期和到期日保持清除,並將 [啟用] 保留[是]。 

  7. 選取 [建立] 以建立秘密。

    顯示如何建立秘密的螢幕快照。

授予存取權

VM 所使用的受控識別必須獲得存取權,才能讀取 金鑰保存庫 儲存的秘密。

  1. 流覽至新建立的 金鑰保存庫。

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

  3. 選取新增存取原則

    顯示金鑰保存庫存取原則畫面的螢幕快照。

  4. 在 [新增存取原則] 區段的 [從範本設定] 底下從下拉功能表中選擇 [秘密管理]。

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

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

  7. 選取 [新增]。

  8. 選取 [儲存]。

存取資料

本節說明如何使用 VM 身分識別取得存取令牌,並使用它從 金鑰保存庫 擷取秘密。 如果您沒有安裝 PowerShell 4.3.1 或更新版本,則必須下載並安裝最新版本。

注意

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

首先,使用 VM 系統指派的受控識別來取得存取令牌,以驗證 金鑰保存庫:

  1. 在入口網站中,流覽至 [虛擬機器],然後移至您的 Windows VM,然後在 [概觀] 中選取 [連線]。
  2. 輸入您在建立 Windows VM 時新增的使用者名稱和密碼
  3. 既然您已建立 與 VM 的遠端桌面連線 ,請在遠端會話中開啟 PowerShell。
  4. 在 PowerShell 中,在租使用者上叫用 Web 要求,以取得 VM 特定埠中本機主機的令牌。

注意

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

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 來擷取您稍早在 金鑰保存庫 中建立的秘密,並在 Authorization 標頭中傳遞存取令牌。 您需要 金鑰保存庫 的 URL,其位於 金鑰保存庫 [概觀] 頁面的 [基本資訊] 區段中

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…

從 金鑰保存庫 擷取秘密之後,您可以使用它向需要名稱和密碼的服務進行驗證。

清除資源

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

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

使用 Windows VM 系統指派的受控識別來存取資源管理員

提示

本文中的步驟可能會根據您從開始的入口網站稍有不同。

本教學課程說明如何建立系統指派的身分識別、將它指派給 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 的資源識別碼的情況下,您必須在 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 存取權的資源群組詳細數據。 將、 <RESOURCE-GROUP><ACCESS-TOKEN> 的值<SUBSCRIPTION-ID>取代為您稍早建立的值。

注意

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 資源上使用使用者指派的身分識別。 使用下列命令,將使用者指派的身分識別指派給單一 VM。 Id使用在上一個步驟中針對 參數傳回的屬性-IdentityID

$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。

在程式代碼可以存取 API 之前,您必須授與 Azure Resource Manager 中資源的身分識別存取權。 在此情況下,您會存取包含 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"}}

深入了解