推薦的認證方式是使用
- 基本受控識別概念
- 如何為您的應用程式建立使用者指派的受控識別
- 如何將角色指派給使用者指定的受管理識別
- 如何從應用程式程式代碼使用使用者指派的受控識別進行驗證
基本受控識別概念
管理身份讓應用程式能安全連接其他 Azure 資源,無需使用秘密金鑰或其他應用程式秘密。 在內部,Azure 追蹤身份及其被允許存取的資源。 Azure 利用這些資訊自動取得 Microsoft Entra 令牌,讓應用程式能夠連接其他 Azure 資源。
設定載入的應用程式時,需要考慮兩種類型的受控識別:
- System-assigned 管理身份直接啟用於 Azure 資源,並與其生命周期綁定。 當資源被刪除時,Azure 會自動幫你刪除該身份。 系統指派的身分識別提供使用受控識別的極簡方法。
- User-assigned 管理身份被建立為獨立的Azure資源,並提供更高的彈性與功能。 它們非常適合涉及多個需要共享相同身份與權限的 Azure 資源解決方案。 例如,若多個虛擬機需要存取同一組 Azure 資源,使用者指派的管理身份便能提供可重用性與最佳化管理。
小提示
如需如何深入瞭解如何選取和管理系統指派和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。
以下章節說明啟用及使用Azure託管應用程式的使用者指派管理身份的步驟。 如果您需要使用系統指派的受控識別,請造訪 系統指派的受控識別 一文以取得詳細資訊。
建立使用者指派的管理型身分識別
使用者指派的管理身份會透過 Azure 入口網站或 Azure CLI 在你的 Azure 訂閱中建立為獨立資源。 Azure CLI指令可在 Azure Cloud Shell或安裝 Azure CLI 的工作站上執行。
將受控識別指派給您的應用程式
使用者指派的管理身份可以與一個或多個 Azure 資源綁定。 使用該身分識別的所有資源都會獲得透過身分識別角色授予的權限。
在 Azure 入口網站中,導覽到承載你應用程式程式碼的資源,例如 Azure App Service 或 Azure Container Apps 實例。
從資源的 [概觀] 頁面中,展開 [[設定],然後從導覽中選取 [身分識別]。
在 [身分識別] 頁面上,切換至 [使用者指派] 索引標籤。
選取 + 新增 以開啟 新增使用者指派的受控識別 面板。
在 [新增使用者指定的受控身份 面板上,使用 [訂用帳戶] 下拉式清單來篩選您的身份搜尋結果。 使用 User assigned managed identities 搜尋框,找到你在 Azure 上為主機應用程式的資源啟用的使用者指派管理的身分識別。
選取身分識別,然後在面板底部選擇 [新增] 以繼續。
將角色指派給管理的身分識別
接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列範圍將角色指派給受控識別:
- 資源:指派的角色僅適用於該特定資源。
- 資源群組:指派的角色會套用至資源群組中包含的所有資源。
- 訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。
以下範例展示了如何在資源群組範圍內指派角色,因為許多應用程式使用單一資源群組來管理所有相關的 Azure 資源。
流覽至資源群組的 [概觀] 頁面,其中包含具有使用者指派受控識別的應用程式。
請選取左側導覽列中的 存取控制 (IAM)。
在 [存取控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增],然後選擇 [新增角色指派] 導覽至 [新增角色指派] 頁面。
[新增角色指派] 頁面會顯示多步驟的索引標籤式工作流程,以將角色指派給身分。 在 [初始 角色] 索引標籤上,使用頂端的搜尋方塊來找出您要指派給身分識別的角色。
從結果中選取角色,然後選擇 [下一步] 以移至 [成員] 標籤。
針對 [[指派存取權給] 選項,選取 [受控識別]。
針對 [成員] 選項,選取 [+ 選取成員] 以開啟 [選取受控識別] 面板。
在 [選取受控識別 面板上,使用 [訂用帳戶] 和 [受控 識別] 下拉式清單來篩選您身分識別的搜尋結果。 使用 Select 搜尋框,找到你為 App 主機Azure資源啟用的使用者指派管理身份。
選取身分,然後在面板底部選擇[選取]以繼續。
請在頁面底部點選 ,然後選擇 [檢閱 + 指派]。
在最後一個 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派],以完成工作流程。
從你的應用程式認證到 Azure 服務
Azure 身份函式庫提供各種憑證——TokenCredential 的實作,以支援不同情境及Microsoft Entra認證流程。 由於在本機執行時無法使用受控身分識別,後續步驟會示範應該在什麼情況下使用哪種認證:
-
本機開發環境:只在本機開發時,請使用名為 DefaultAzureCredential 的類別,以便使用預先配置且有意見的認證鏈。
DefaultAzureCredential會從你的本地工具或 IDE(如 Azure CLI 或 Visual Studio)中發現使用者憑證。 它也提供重試的彈性和便利性、回應等候時間,以及支援多個驗證選項。 請造訪 在本地開發期間對 Azure 服務進行驗證 文章以了解更多資訊。 - Azure 託管應用程式:當您的應用程式在Azure中執行時,請使用 ManagedIdentityCredential 安全發現已設定的管理身份。 指定此準確類型的認證可防止意外地選用其他可用的認證。
實作程序代碼
使用 vcpkg,將 azure-identity-cpp 套件加入您的應用程式。
在您選擇的終端機中,導覽至應用程式專案目錄,然後執行下列命令:
vcpkg add port azure-identity-cpp在你的 CMake 檔案中加入以下內容:
find_package(azure-identity-cpp CONFIG REQUIRED) target_link_libraries(<your project name> PRIVATE Azure::azure-identity)Azure 服務是透過各種 Azure SDK 用戶端函式庫中的專用用戶端存取。 對於任何在應用程式中實例化 Azure SDK 用戶端的 C++ 程式碼,你需要:
- 請附上
azure/identity.hpp標頭。 - 建立
DefaultAzureCredential的執行個體。 - 將
DefaultAzureCredential的實例傳給Azure SDK客戶端建構子。 - 將環境變數
AZURE_CLIENT_ID設為你使用者指派管理身份的客戶端 ID。 - 將環境變數設定
AZURE_TOKEN_CREDENTIALS為ManagedIdentityCredential確保使用DefaultAzureCredential受管理身份憑證。 這種做法讓驗證在部署到 Azure 時更可預測,也更容易除錯。 欲了解更多資訊,請參閱 使用特定憑證。
以下程式碼段落中展示了 Azure Storage Blob 用戶端的範例。
#include <azure/identity.hpp> #include <azure/storage/blobs.hpp> #include <iostream> #include <memory> #include <cstdlib> int main() { try { // Set the AZURE_CLIENT_ID environment variable to your user-assigned managed identity client ID // This can be done in your deployment environment or in code (shown below for demonstration) // std::putenv("AZURE_CLIENT_ID=your-user-assigned-identity-client-id"); // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID environment variable // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID and AZURE_TOKEN_CREDENTIALS environment variables auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true); // Create a client for the specified storage account std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"; Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential); // Get a reference to a container std::string containerName = "sample-container"; auto containerClient = blobServiceClient.GetBlobContainerClient(containerName); // Get a reference to a blob std::string blobName = "sample-blob"; auto blobClient = containerClient.GetBlobClient(blobName); // TODO: perform some action with the blob client // auto downloadResult = blobClient.DownloadTo("path/to/local/file"); std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl; } catch (const std::exception& ex) { std::cout << "Exception: " << ex.what() << std::endl; return 1; } return 0; }- 請附上
如同 Azure SDK C++ 認證概述 文章中討論,DefaultAzureCredential 支援多種認證方法,並決定執行時所使用的認證方法。 這種方法的好處是,您的應用程式可以在不同的環境中使用不同的驗證方法,而無需實作環境特定的程式碼。 當前述程式碼在您的工作站執行本地開發時,DefaultAzureCredential 會根據環境設定,使用應用程式服務主要帳戶,或是開發工具憑證來驗證其他 Azure 資源。 因此,相同的程式碼可用於在本地開發及部署到 Azure 時,將應用程式認證至 Azure 資源。
這很重要
DefaultAzureCredential 結合Azure主機環境與本地開發使用的憑證,簡化了部署於 Azure 應用程式的認證流程。 在生產環境中,最好使用特定的認證類型,讓驗證更可預測且更容易偵錯。
DefaultAzureCredential 的替代方案是使用 ManagedIdentityCredential。 使用 ManagedIdentityCredential 步驟與使用 DefaultAzureCredential 類型相同。
以下程式碼段落中展示了 Azure Storage Blob 用戶端的範例。
#include <azure/identity.hpp>
#include <azure/storage/blobs.hpp>
#include <iostream>
#include <memory>
int main() {
try {
// Create a user-assigned managed identity credential with the client ID
Azure::Identity::ManagedIdentityCredentialOptions options;
options.ClientId = "abcd1234-..."; // Replace with your user-assigned managed identity client ID
auto credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>(options);
// Create a client for the specified storage account
std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
// Get a reference to a container
std::string containerName = "sample-container";
auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
// Get a reference to a blob
std::string blobName = "sample-blob";
auto blobClient = containerClient.GetBlobClient(blobName);
// TODO: perform some action with the blob client
// auto downloadResult = blobClient.DownloadTo("path/to/local/file");
std::cout << "Successfully authenticated using user-assigned managed identity." << std::endl;
} catch (const std::exception& ex) {
std::cout << "Exception: " << ex.what() << std::endl;
return 1;
}
return 0;
}