將 Azure 裝載的應用程式驗證給其他 Azure 資源的建議方法是使用 受控識別。 大部分的 Azure 服務都支援此方法,包括裝載於 Azure App Service、Azure 容器應用程式和 Azure 虛擬機器上的應用程式。 在 驗證概述 頁面上探索有關不同驗證技術和方法的更多資訊。 在前面的章節中,您將瞭解:
- 基本受控識別概念
- 如何為您的應用程式建立系統指派的受控識別
- 如何將角色指派給系統指派的受控識別
- 如何使用應用程式程式碼中的系統指派受控識別進行驗證
基本受控識別概念
受控識別可讓您的應用程式安全地連線到其他 Azure 資源,而不需要使用秘密金鑰或其他應用程式秘密。 在內部,Azure 會追蹤身分識別,以及允許連線到的資源。 Azure 會使用此資訊來自動取得應用程式的 Microsoft Entra 權杖,以允許它連線到其他 Azure 資源。
設定裝載應用程式時,需要考慮兩種類型的受控識別:
- 系統指派的 受控識別會直接在 Azure 資源上啟用,並系結至其生命週期。 刪除資源時,Azure 會自動為您刪除身分識別。 系統指派的身分識別提供使用受控識別的最小方法。
- 使用者指派 的受控識別會建立為獨立的 Azure 資源,並提供更大的彈性和功能。 它們非常適合涉及需要共用相同身分識別和許可權的多個 Azure 資源的解決方案。 例如,如果多個虛擬機器需要存取同一組 Azure 資源,使用者指派的受控識別可提供可重複使用性和最佳化管理。
小提示
如需如何深入瞭解如何選取和管理系統指派和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。
下列各節說明為 Azure 裝載的應用程式啟用和使用系統指派受控識別的步驟。 如果您需要使用使用者指派的受控識別,請流覽 使用者指派的受控識別 一文以取得詳細資訊。
在 Azure 裝載資源上啟用系統指派的受控識別
若要開始搭配應用程式使用系統指派的受控識別,請在裝載應用程式的 Azure 資源上啟用身分識別,例如 Azure App Service、Azure 容器應用程式或 Azure 虛擬機器。
您可以使用 Azure 入口網站或 Azure CLI 來啟用 Azure 資源的系統指派受控識別。
將角色指派給受控識別
接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列範圍將角色指派給受控識別:
- 資源:指派的角色僅適用於該特定資源。
- 資源群組:指派的角色會套用至資源群組中包含的所有資源。
- 訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。
下列範例示範如何在資源群組範圍指派角色,因為許多應用程式都會使用單一資源群組來管理其所有相關 Azure 資源。
流覽至資源群組的 [ 概觀 ] 頁面,其中包含具有系統指派受控識別之應用程式。
選取左側導覽中的存取控制 (IAM)。
在 [ 存取控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增 ],然後選擇 [ 新增角色指派 ] 以導覽至 [ 新增角色指派 ] 頁面。
新增 角色指派 頁面會呈現索引標籤式多步驟工作流程,可將角色指派給身分識別。 在初始 角色 索引標籤上,使用頂端的搜尋方塊來尋找您要指派給身分識別的角色。
從結果中選取角色,然後選擇 Next ( 下一步 ) 以移至 Members (成員) 索引標籤。
針對 [指派存取權] 選項,選取 [受控識別]。
針對 [成員] 選項,選擇 [+ 選取成員 ] 以開啟 [選取受控識別 ] 面板。
在 [ 選取受控識別 ] 面板上,使用 [訂用帳戶 ] 和 [受控識別] 下拉式清單來篩選身分識別的搜尋結果。 使用 [ 選取] 搜尋方塊來尋找您針對裝載應用程式的 Azure 資源啟用的系統身分識別。
選取身分識別,然後選擇面板底部的 [選取 ] 以繼續。
選取頁面底部的 檢閱 + 指派 。
在最終的 [ 檢閱 + 指派 ] 索引標籤上,選取 [ 檢閱 + 指派 ] 以完成工作流程。
從您的應用程式向 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,完成下列步驟以配置記號型鑑別:
匯入
@azure/identity套件。將適當的
TokenCredential實例傳遞給用戶端:- 當您的應用程式在本機執行時使用
DefaultAzureCredential - 當您的應用程式在 Azure 中執行時使用
ManagedIdentityCredential。
import { BlobServiceClient } from '@azure/storage-blob'; import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity'; 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") { return new BlobServiceClient(url, new ManagedIdentityCredential()); } else { return new BlobServiceClient(url, new DefaultAzureCredential()); } } async function main() { try { const blobServiceClient = createBlobServiceClient(); const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME); 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); });- 當您的應用程式在本機執行時使用
實作程式碼
在JavaScript專案中,新增 @azure/身分套件 。 在您選擇的終端機中,導覽至應用程式專案目錄,然後執行下列命令:
npm install @azure/identity @types/node
Azure 服務是使用各種 Azure SDK 用戶端程式庫中的特製化用戶端類別來存取。 在 中 index.js,完成下列步驟以配置記號型鑑別:
匯入
@azure/identity套件。將適當的
TokenCredential實例傳遞給用戶端:- 當您的應用程式在本機執行時使用
DefaultAzureCredential - 當您的應用程式在 Azure 中執行時使用
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") { return new BlobServiceClient(url, new ManagedIdentityCredential()); } 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會探索您的受控識別設定,以自動向其他服務進行驗證。