推薦的認證方式是使用
- 基本受控識別概念
- 如何為您的應用程式建立系統指派的受控識別
- 如何將角色指派給系統指派的受控身分識別
- 如何使用應用程式程式碼中的系統指派受控識別進行驗證
基本受控識別概念
管理身份讓應用程式能安全連接其他 Azure 資源,無需使用秘密金鑰或其他應用程式秘密。 在內部,Azure 追蹤身份及其被允許存取的資源。 Azure 利用這些資訊自動取得 Microsoft Entra 令牌,讓應用程式能夠連接其他 Azure 資源。
設定裝載應用程式時,需要考慮兩種類型的受控識別:
- System-assigned 管理身份直接啟用於 Azure 資源,並與其生命周期綁定。 當資源被刪除時,Azure 會自動幫你刪除該身份。 系統指派的身分識別提供使用受控識別的簡約方法。
- User-assigned 管理身份被建立為獨立的Azure資源,並提供更高的彈性與功能。 它們非常適合涉及多個需要共享相同身份與權限的 Azure 資源解決方案。 例如,若多個虛擬機需要存取同一組 Azure 資源,使用者指派的管理身份便能提供可重用性與最佳化管理。
小提示
如需如何深入瞭解如何選取和管理系統指派和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。
以下章節說明啟用並使用系統指派的管理身份給 Azure 主機應用程式的步驟。 如果您需要使用使用者指派的受控識別,請流覽 用戶指派的受控識別 文章以取得詳細資訊。
在 Azure 主機資源上啟用系統指派的管理身份
要開始在您的應用程式中使用系統指派的管理身份,請在託管應用程式的 Azure 資源上啟用該身份,例如 Azure App Service、Azure Container Apps 或 Azure Virtual Machines 實例。
你可以透過 Azure 入口網站或 Azure CLI 啟用系統指派的管理身份,為 Azure 資源設定身分識別。
將角色指派給受控識別
接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列的範圍將角色指派給受管理的身分識別:
- 資源:指派的角色僅適用於該特定資源。
- 資源群組:指派的角色會套用至資源群組中包含的所有資源。
- 訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。
以下範例展示了如何在資源群組範圍內指派角色,因為許多應用程式使用單一資源群組來管理所有相關的 Azure 資源。
流覽至資源群組的 [概觀] 頁面,其中包含具有系統指派受控識別的應用程式。
請選取左側導覽列中的 存取控制 (IAM)。
在 [存取控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增],然後選擇 [新增角色指派] 導覽至 [新增角色指派] 頁面。
[新增角色指派] 頁面會顯示多步驟的索引標籤式工作流程,以將角色指派給身分。 在 [初始 角色] 索引標籤上,使用頂端的搜尋方塊來找出您要指派給身分識別的角色。
從結果中選取角色,然後選擇 [下一步] 以移至 [成員] 標籤。
針對 [[指派存取權給] 選項,選取 [受控識別]。
針對 [成員] 選項,選取 [+ 選取成員] 以開啟 [選取受控識別] 面板。
在 [選取受控識別 面板上,使用 [訂用帳戶] 和 [受控 識別] 下拉式清單來篩選您身分識別的搜尋結果。 使用 Select 搜尋框,找到你為託管應用程式的Azure資源啟用的系統身份。
選取身分,然後在面板底部選擇[選取]以繼續。
請在頁面底部點選 ,然後選擇 [檢閱 + 指派]。
在最後一個 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派],以完成工作流程。
從你的應用程式認證到 Azure 服務
Azure Identity 函式庫 提供各種 認證方法—這些是經過調整的實作,用於支援不同情境下的 TokenCredential 和 Microsoft Entra 認證流程。 由於受控識別在本機執行時無法使用,因此接下來的步驟示範在哪個案例中使用哪個認證:
-
本機開發環境:只在本機開發時,請使用名為 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會自動發現你的管理身份設定,並自動認證其他服務。