使用適用於 JavaScript 的 Azure SDK 向 Azure 資源驗證 Azure 裝載的應用程式

在 Azure 中裝載應用程式時(使用像是 Azure App 服務、Azure 虛擬機器 或 Azure 容器執行個體 等服務),向 Azure 資源驗證應用程式的建議方法是使用受控識別

受控識別會為您的應用程式提供身分識別,讓應用程式連線到其他 Azure 資源,而不需要使用秘密(例如密鑰 連接字串)。 在內部,Azure 知道您應用程式的身分識別,及其能夠連線至哪些資源。 Azure 會使用這項資訊自動取得應用程式的 Microsoft Entra 令牌,以允許它連線到其他 Azure 資源,而不需要管理驗證秘密(建立或輪替)。

受控識別類型

受控身分識別有兩種:

  • 系統指派的受控識別 - 單一 Azure 資源
  • 使用者指派的受控識別 - 多個 Azure 資源

本文將說明為應用程式啟用及使用系統指派的受控識別所需的步驟。 如果您需要使用由使用者指派的受控識別,請參閱管理使用者指派的受控識別一文,以了解如何建立使用者指派的受控識別。

單一資源的系統指派受控識別

系統指派的受控識別是由 提供並直接系結至 Azure 資源。 當您在 Azure 資源上啟用受控識別時,您會取得系統為該資源指派的受控識別。 它會系結至 Azure 資源的生命週期。 因此,當刪除資源時,Azure 會自動為您刪除身分識別。 您只需要為裝載程式碼的 Azure 資源啟用受控識別即可,因此,這可說是最容易使用的受控識別類型。

多個資源的使用者指派受控識別

從概念上講,此身分識別是獨立的 Azure 資源。 您的解決方案有多個工作負載執行於多個 Azure 資源上,且這些資源全都需要共用相同的身分識別和相同的權限時,最常用到此身分識別。 例如,如果您的解決方案具有在多個 App Service 和虛擬機實例上執行的元件,而且它們都需要存取同一組 Azure 資源,跨這些資源建立和使用使用者指派的受控識別會有意義。

1 - 系統指派:在託管應用程式中啟用

第一個步驟是在裝載應用程式的 Azure 資源上啟用受控識別。 例如,如果您要使用 Azure App 服務 裝載 Django 應用程式,則必須為該 App Service Web 應用程式啟用受控識別。 如果您使用虛擬機器來裝載您的應用程式,則應讓 VM 能夠使用受控識別。

您可以使用 Azure 入口網站或 Azure CLI,讓受控識別用於 Azure 資源。

指示 Screenshot
在 Azure 入口網站中瀏覽至裝載應用程式程式碼的資源。

例如,您可以在頁面頂端的搜尋方塊中輸入資源的名稱,並在對話方塊中加以選取,以瀏覽至該資源。
A screenshot showing how to use the top search bar in the Azure portal to locate and navigate to a resource in Azure.
在資源的頁面上,從左側功能表中選取 [身分識別] 功能表項目。

所有能夠支援受控識別的 Azure 資源都會有 [身分識別] 功能表項目,即便功能表的配置可能稍有不同。
A screenshot showing the location of the Identity menu item in the left-hand menu for an Azure resource.
在 [身分識別] 頁面上:
  1. 將 [狀態] 滑桿變更為 [開啟]
  2. 選取 [儲存]。
確認對話框會驗證您想要為您的服務啟用受控識別。 回答 [是 ] 以啟用 Azure 資源的受控識別。
A screenshot showing how to enable managed identity for an Azure resource on the resource's Identity page.

2 - 將角色指派給受控識別

接下來,您必須判斷應用程式需要哪些角色 (權限),並將受控識別指派給 Azure 中的這些角色。 受控識別可以在資源、資源群組或訂閱範圍獲派角色。 此範例會顯示如何在資源群組範圍內指派角色,因為多數應用程式都會將所有 Azure 資源劃分在單一資源群組中。

指示 Screenshot
用 Azure 入口網站頂端的搜尋方塊,搜尋資源群組的名稱,藉此找出應用程式的資源群組。

選取對話方塊中 資源群組 標題下方的資源群組名稱,瀏覽至您的資源群組。
A screenshot showing how to use the top search bar in the Azure portal to locate and navigate to a resource group in Azure.
在資源群組分頁中,從左側功能表選取 存取控制 (IAM) A screenshot showing the location of the Access control (I A M ) menu item in the left-hand menu of an Azure resource group.
存取控制 (IAM) 分頁上:
  1. 選取 [角色指派] 索引標籤。
  2. 從頂端功能表選取 [+ 新增],然後從產生的下拉功能表中選取 [新增角色指派]
A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.
新增角色指派 分頁列出所有可指派至資源群組之角色的清單。
  1. 請善用搜尋方塊,將清單篩選為更易於管理的大小。 此範例顯示如何針對儲存體 Blob 角色進行篩選。
  2. 選取您要指派的角色。
    選取 [下一步] 前往下一個畫面。
A screenshot showing how to filter and select role assignments to be added to the resource group.
下一個 新增角色指派 分頁能讓您指定要指派角色的使用者。
  1. 選取 [指派存取權] 下的 [受控識別]
  2. 選取 [成員] 下的 [+ 選取成員]
對話框會在 Azure 入口網站 右側開啟。
A screenshot showing how to select managed identity as the type of user you want to assign the role (permission) on the add role assignments page.
在 [選取受控識別] 對話方塊中:
  1. [受控識別] 下拉式清單和 [選取] 文字方塊可用來篩選訂閱中的受控識別清單。 此範例選取了 App Service,因此只會顯示與 App Service 相關聯的受控識別。
  2. 為裝載應用程式的 Azure 資源選取受控識別。
選擇對話框底部的 [ 選取 ] 以繼續。
A screenshot showing how to use the select managed identities dialog to filter and select the managed identity to assign the role to.
受控識別會在 [ 新增角色指派 ] 畫面上顯示為已選取。

選取 [檢閱 + 指派] 移至最終分頁,然後再次選取 [檢閱 + 指派] 完成此流程。
A screenshot of the final add role assignment screen where a user needs to select the Review + Assign button to finalize the role assignment.

3 - 在應用程式中實作 DefaultAzureCredential

類別 DefaultAzureCredential 會自動偵測正在使用受控識別,並使用受控識別向其他 Azure 資源進行驗證。 如 Azure SDK for JavaScript 驗證概觀一文所述,支援多個驗證方法,DefaultAzureCredential並判斷運行時間所使用的驗證方法。 因此,您的應用程式可在相異的環境中使用不同的驗證方法,無須實作環境特定程式碼。

首先,將 @azure/身分 識別套件新增至您的應用程式。

npm install @azure/identity

接下來,針對在應用程式中建立 Azure SDK 用戶端物件的任何 JavaScript 程式代碼,您會想要:

  1. 從模組匯入 DefaultAzureCredential@azure/identity 類別。
  2. 建立 DefaultAzureCredential 物件。
  3. DefaultAzureCredential 對象傳遞至 Azure SDK 用戶端物件建構函式。

下列程式碼區段示範其中一種範例。

// connect-with-default-azure-credential.js
import { BlobServiceClient } from '@azure/storage-blob';
import { DefaultAzureCredential } from '@azure/identity';
import 'dotenv/config'

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error('Azure Storage accountName not found');

const blobServiceClient = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  new DefaultAzureCredential()
);

在本機開發期間於本機工作站上執行上述程式代碼時,SDK 方法 DefaultAzureCredential()會在應用程式服務主體或 VS Code、Azure CLI 或 Azure PowerShell 的環境變數中尋找一組開發人員認證,這兩種認證都可用來在本機開發期間向 Azure 資源驗證應用程式。 如此一來,這個相同的程式代碼可用來在本機開發期間和部署至 Azure 時,向 Azure 資源驗證您的應用程式。