共用方式為


使用使用者指派的受控識別,將 Azure 裝載的 JavaScript 應用程式驗證至 Azure 資源

將 Azure 裝載的應用程式驗證給其他 Azure 資源的建議方法是使用 受控識別大部分的 Azure 服務都支援此方法,包括裝載於 Azure App Service、Azure 容器應用程式和 Azure 虛擬機器上的應用程式。 在 驗證概述 頁面上探索有關不同驗證技術和方法的更多資訊。 在前面的章節中,您將瞭解:

  • 基本受控識別概念
  • 如何為您的應用程式建立使用者指派的受控識別
  • 如何將角色指派給使用者指派的受控識別
  • 如何使用應用程式程式碼中的使用者指派受控識別進行驗證

基本受控識別概念

受控識別可讓您的應用程式安全地連線到其他 Azure 資源,而不需要使用秘密金鑰或其他應用程式秘密。 在內部,Azure 會追蹤身分識別,以及允許連線到的資源。 Azure 會使用此資訊來自動取得應用程式的 Microsoft Entra 權杖,以允許它連線到其他 Azure 資源。

設定裝載應用程式時,需要考慮兩種類型的受控識別:

  • 系統指派的 受控識別會直接在 Azure 資源上啟用,並系結至其生命週期。 刪除資源時,Azure 會自動為您刪除身分識別。 系統指派的身分識別提供使用受控識別的最小方法。
  • 使用者指派 的受控識別會建立為獨立的 Azure 資源,並提供更大的彈性和功能。 它們非常適合涉及需要共用相同身分識別和許可權的多個 Azure 資源的解決方案。 例如,如果多個虛擬機器需要存取同一組 Azure 資源,使用者指派的受控識別可提供可重複使用性和最佳化管理。

小提示

如需如何深入瞭解如何選取和管理系統指派和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。

下列各節說明為 Azure 裝載的應用程式啟用和使用使用者指派的受控識別的步驟。 如果您需要使用系統指派的受控識別,請流覽 系統指派的受控識別 一文以取得詳細資訊。

建立使用者指派的受管理的身分識別

使用者指派的受控識別會使用 Azure 入口網站或 Azure CLI 在 Azure 訂用帳戶中建立為獨立資源。 Azure CLI 命令可以在 Azure Cloud Shell已安裝 Azure CLI 的工作站上執行。

  1. 在 Azure 入口網站中,在主要搜尋列中輸入 受控識別 ,然後在 [服務 ] 區段下選取相符的結果。

  2. [受控識別 ] 頁面上,選取 [+ 建立]。

    螢幕擷取畫面顯示管理使用者指派受控識別的頁面。

  3. 在 [ 建立使用者指派的受控識別 ] 頁面上,選取使用者指派的受控識別的訂用帳戶、資源群組和區域,然後提供名稱。

  4. 選取 [ 檢閱 + 建立 ] 以檢閱和驗證您的輸入。

    螢幕擷取畫面,顯示建立使用者指派受控識別的表單。

  5. 選取 [ 建立 ] 以建立使用者指派的受控識別。

  6. 建立身分識別之後,選取 [ 移至資源]。

  7. 在新身分識別的 [ 概觀 ] 頁面上,複製 [用戶端識別碼] 值,以便稍後在設定應用程式程式碼時使用。

將受控識別指派給您的應用程式

使用者指派的受控識別可以與一或多個 Azure 資源相關聯。 使用該身分的所有資源都會取得透過身分角色套用的許可。

  1. 在 Azure 入口網站中,流覽至裝載應用程式程式碼的資源,例如 Azure App Service 或 Azure 容器應用程式執行個體。

  2. 從資源的 [概觀] 頁面中,展開 [設定],然後從導覽中選取 [身分識別]。

  3. 身分識別頁面上,切換至使用者指派索引標籤。

  4. 選取 [+ 新增 ] 以開啟 [ 新增使用者指派的受控識別 ] 面板。

  5. [ 新增使用者指派的受控識別 ] 面板上,使用 [ 訂用帳戶 ] 下拉式清單來篩選身分識別的搜尋結果。 使用 [使用者指派的受控識別 ] 搜尋方塊,找出您針對裝載應用程式的 Azure 資源啟用的使用者指派受控識別。

  6. 選取身分,然後選擇面板底部的 [ 新增 ] 以繼續。

    螢幕擷取畫面,顯示如何將使用者指派的受控識別與應用程式產生關聯。

將角色指派給受控識別

接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列範圍將角色指派給受控識別:

  • 資源:指派的角色僅適用於該特定資源。
  • 資源群組:指派的角色會套用至資源群組中包含的所有資源。
  • 訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。

下列範例示範如何在資源群組範圍指派角色,因為許多應用程式都會使用單一資源群組來管理其所有相關 Azure 資源。

  1. 流覽至資源群組的 [ 概觀 ] 頁面,其中包含具有使用者指派受控識別之應用程式。

  2. 選取左側導覽中的存取控制 (IAM)。

  3. 在 [ 存取控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增 ],然後選擇 [ 新增角色指派 ] 以導覽至 [ 新增角色指派 ] 頁面。

    螢幕擷取畫面,顯示如何存取身分識別角色指派頁面。

  4. 新增 角色指派 頁面會呈現索引標籤式多步驟工作流程,可將角色指派給身分識別。 在初始 角色 索引標籤上,使用頂端的搜尋方塊來尋找您要指派給身分識別的角色。

  5. 從結果中選取角色,然後選擇 Next ( 下一步 ) 以移至 Members (成員) 索引標籤。

  6. 針對 [指派存取權] 選項,選取 [受控識別]。

  7. 針對 [成員] 選項,選擇 [+ 選取成員 ] 以開啟 [選取受控識別 ] 面板。

  8. [ 選取受控識別 ] 面板上,使用 [訂用帳戶 ] 和 [受控識別] 下拉式清單來篩選身分識別的搜尋結果。 使用 [ 選取 搜尋] 方塊來尋找您針對裝載應用程式的 Azure 資源啟用的使用者指派受控識別。

    顯示受控識別指派程式的螢幕擷取畫面。

  9. 選取身分識別,然後選擇面板底部的 [選取 ] 以繼續。

  10. 選取頁面底部的 檢閱 + 指派

  11. 在最終的 [ 檢閱 + 指派 ] 索引標籤上,選取 [ 檢閱 + 指派 ] 以完成工作流程。

從您的應用程式向 Azure 服務進行驗證

Azure 身分識別程式庫提供各種認證 - 適合支援不同案例和 Microsoft Entra 驗證流程的實作TokenCredential。 由於受控識別在本機執行時無法使用,因此接下來的步驟示範在哪個案例中使用哪個認證:

  • 本機開發環境僅在本機開發期間,請針對有意見、預先設定的認證鏈結使用名為 DefaultAzureCredential 的類別。 DefaultAzureCredential 從本機工具或 IDE 探索使用者認證,例如 Azure CLI 或 Visual Studio Code。 它還為重試、響應等待時間以及對多種身份驗證選項的支持提供了靈活性和便利性。 請瀏覽在本 機開發期間向 Azure 服務進行驗證 一文,以深入瞭解。
  • Azure 裝載的應用程式:當您的應用程式在 Azure 中執行時,請使用 來 ManagedIdentityCredential 安全地探索針對應用程式設定的受控識別。 指定此確切類型的認證可防止意外挑選其他可用認證。

實作程式碼

在JavaScript專案中,新增 @azure/身分套件 。 在您選擇的終端機中,導覽至應用程式專案目錄,然後執行下列命令:

npm install @azure/identity

Azure 服務是使用各種 Azure SDK 用戶端程式庫中的特製化用戶端類別來存取。 在 中 index.js,完成下列步驟以配置記號型鑑別:

  1. 匯入 @azure/identity 套件。
  2. 將適當的 TokenCredential 實例傳遞給用戶端:
    • 當您的應用程式在本機執行時使用 DefaultAzureCredential
    • 當您的應用程式在 Azure 中執行時使用 ManagedIdentityCredential ,並設定用戶端識別碼、資源識別碼或物件識別碼。

用戶端識別碼可用來在設定需要使用該身分識別進行驗證的應用程式或服務時識別受控識別。

  1. 使用下列命令擷取指派給使用者指派受控識別的用戶端識別碼:

    az identity show \
        --resource-group <resource-group-name> \
        --name <identity-name> \
        --query 'clientId'
    
  2. 使用用戶端識別碼進行設定 ManagedIdentityCredential

    import { BlobServiceClient } from '@azure/storage-blob';
    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';
    
    console.log(process.env);
    
    function createBlobServiceClient() {
        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
        if (!accountName) throw Error('Azure Storage accountName not found');
        const url = `https://${accountName}.blob.core.windows.net`;
    
        if (process.env.NODE_ENV === "production") {
            const clientId = process.env.AZURE_CLIENT_ID;
            if (!clientId) throw Error('AZURE_CLIENT_ID not found for Managed Identity');
            return new BlobServiceClient(url, new ManagedIdentityCredential(clientId));
        } else {
            return new BlobServiceClient(url, new DefaultAzureCredential());
        }
    }
    
    async function main() {
        try {
            const blobServiceClient = createBlobServiceClient();
            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);
            // do something with client
            const properties = await containerClient.getProperties();
    
            console.log(properties);
        } catch (err) {
            console.error("Error retrieving container properties:", err.message);
            throw err;
        }
    }
    
    main().catch((err) => {
        console.error("Error running sample:", err.message);
        process.exit(1);
    });
    

實作程式碼

在 TypeScript 專案中,新增 @azure/身分識別 套件。 在您選擇的終端機中,導覽至應用程式專案目錄,然後執行下列命令:

npm install typescript @azure/identity @types/node

Azure 服務是使用各種 Azure SDK 用戶端程式庫中的特製化用戶端類別來存取。 在 中 index.js,完成下列步驟以配置記號型鑑別:

  1. 匯入 @azure/identity 套件。
  2. 將適當的 TokenCredential 實例傳遞給用戶端:
    • 當您的應用程式在本機執行時使用DefaultAzureCredential
    • 當您的應用程式在 Azure 中執行時使用 ManagedIdentityCredential ,並設定用戶端識別碼、資源識別碼或物件識別碼。

用戶端識別碼可用來在設定需要使用該身分識別進行驗證的應用程式或服務時識別受控識別。

  1. 使用下列命令擷取指派給使用者指派受控識別的用戶端識別碼:

    az identity show \
        --resource-group <resource-group-name> \
        --name <identity-name> \
        --query 'clientId'
    
  2. 使用用戶端識別碼進行設定 ManagedIdentityCredential

    import { BlobServiceClient } from '@azure/storage-blob';
    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';
    
    function createBlobServiceClient(): BlobServiceClient {
        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
        if (!accountName) throw Error('Azure Storage accountName not found');
        const url = `https://${accountName}.blob.core.windows.net`;
    
        if (process.env.NODE_ENV === "production") {
            const clientId = process.env.AZURE_CLIENT_ID;
            if (!clientId) throw Error('AZURE_CLIENT_ID not found for Managed Identity');
            return new BlobServiceClient(url, new ManagedIdentityCredential(clientId));
        } else {
            return new BlobServiceClient(url, new DefaultAzureCredential());
        }
    }
    
    async function main(): Promise<void> {
        try {
            const blobServiceClient = createBlobServiceClient();
            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME!);
            const properties = await containerClient.getProperties();
    
            console.log(properties);
        } catch (err: any) {
            console.error("Error retrieving container properties:", err.message);
            throw err;
        }
    }
    
    main().catch((err: Error) => {
        console.error("Error running sample:", err.message);
        process.exit(1);
    });
    

上述程式碼的行為會因執行環境而異:

  • 在本機開發工作站上, DefaultAzureCredential 在環境變數中尋找應用程式服務主體,或在本機安裝的開發人員工具 (例如 Visual Studio Code) 中尋找一組開發人員認證。
  • 部署至 Azure 時, ManagedIdentityCredential 會探索您的受控識別設定,以自動向其他服務進行驗證。