瞭解如何使用受控識別,從在 Azure App Service 上執行的 Web 應用程式存取 Azure 記憶體(不是已登入的使用者)。 簡化安全性並避免管理秘密。
您想從 Web 應用程式新增對 Azure 資料平面 (Azure 儲存體、Azure SQL Database、Azure Key Vault 或其他服務) 的存取權。 您可以使用共用金鑰,但必須擔心哪些人可以建立、部署和管理祕密的操作安全性。 金鑰也會簽入 GitHub,此舉可能引來駭客掃描金鑰。 讓 Web 應用程式存取數據更安全的方法,就是使用 受控識別。
來自 Microsoft Entra ID 的受控識別可讓 App Service 透過角色型存取控制 (RBAC) 存取資源,而不需要應用程式認證。 將受控識別指派給您的 Web 應用程式後,Azure 會負責建立和散發憑證。 不再需要擔心管理祕密或應用程式認證。
在本教學課程中,您會:
- 在 Web 應用程式上建立系統指派的受控識別。
- 建立儲存體帳戶和 Azure Blob 儲存體容器。
- 使用受控識別從 Web 應用程式存取儲存體。
如果您沒有 Azure 訂用帳戶,請在開始之前建立 Azure 免費帳戶 。
必要條件
- 在 已啟用 App Service 驗證/授權模組的 Azure App Service 上執行的 Web 應用程式。
啟用應用程式上的受控識別
如果您透過 Visual Studio 建立並發佈 Web 應用程式,則系統會為您的應用程式啟用受控識別。 在應用程式服務中,選取左側窗格中的 [身分識別],然後選取 [系統指派]。 確認 [狀態 ] 已設定為 [開啟]。 若未設定為開啟,請依序選取 [儲存] 和 [是] 以啟用系統指派的受控識別。 啟用受控識別時,狀態會設定為「開啟」,且物件識別碼可供使用。
此步驟會建立新的物件識別碼,不同於在 [驗證/授權] 窗格中建立的應用程式識別碼。 複製系統指派的受控識別物件識別碼。 稍後您將需要此資訊。
建立儲存體帳戶和 Blob 儲存體容器
現在您已準備好建立儲存體帳戶和 Blob 儲存體容器。
每個儲存體帳戶都必須屬於 Azure 資源群組。 資源群組是用來群組 Azure 服務的邏輯容器。 當您建立儲存體帳戶時,可以選擇建立新的資源群組,或使用現有的資源群組。 本文說明如何建立新資源群組。
一般用途 v2 儲存體帳戶提供所有 Azure 儲存體服務的存取權:Blob、檔案、佇列、資料表和磁碟。 此處說明的步驟會建立一般用途 v2 儲存體帳戶,但建立任何類型儲存體帳戶的步驟都很類似。
Azure 儲存體中的 Blob 會組織成容器。 您必須先建立容器,稍後才能在本教學課程中上傳 Blob。
若要在 Azure 入口網站中建立一般用途 v2 儲存體帳戶,請遵循下列步驟。
在 Azure 入口網站功能表上,選取 [所有服務]。 在資源清單中,輸入 記憶體帳戶。 當您開始輸入時,清單會根據您的輸入進行篩選。 選取 [儲存體帳戶]。
在出現的 [ 記憶體帳戶] 視窗中,選取 [ 建立]。
選取要在其中建立儲存體帳戶的訂用帳戶。
在 [資源群組] 欄位下,從下拉式功能表中選取包含您 Web 應用程式的資源群組。
接下來,輸入儲存體帳戶的名稱。 您所選擇的名稱在整個 Azure 中必須是唯一的。 名稱的長度必須介於 3 到 24 個字元之間,且只能包含數字和小寫字母。
選取儲存體帳戶的位置,或使用預設位置。
針對 [效能],選取 [標準] 選項。
針對 [ 備援],從下拉式清單中選取 [ 本地備援記憶體 ][LRS] 選項。
選取 [檢閱] 以檢閱您的儲存體帳戶設定並建立帳戶。
選取 建立。
若要在 Azure 儲存體中建立 Blob 儲存體容器,請遵循下列步驟。
前往 Azure 入口中的新的儲存帳戶。
在記憶體帳戶的左側功能表中,捲動至 [資料記憶體] 區段,然後選取 [ 容器]。
選取 [ + 容器] 按鈕。
輸入新容器的名稱。 容器名稱必須是小寫,以字母或數字開頭,並且只能包含字母、數字和虛線 (-) 字元。
設定容器的公用存取層級。 預設層級為 [私人 (無匿名存取)]。
選取 [建立 ] 以建立容器。
授權存取儲存帳戶
您需要授予您的 Web 應用程式對儲存帳戶的存取權,才能建立、讀取或刪除 Blob。 在上一個步驟中,您已使用受控識別,設定在 App Service 上執行的 Web 應用程式。 使用 Azure 角色型存取控制,您可以像對待任何安全性主體一樣,將受控身分識別的存取權授予另一個資源。 「儲存體 Blob 資料參與者」角色會提供 Web 應用程式 (以系統指派的受控識別表示) 讀取、寫入和刪除 Blob 容器和資料的存取權。
注意
Azure RBAC 不支援私人 Blob 容器上的某些作業,例如檢視 Blob 或複製不同帳戶的 Blob。 具有私人存取層級的 Blob 容器需要 SAS 權杖,才能執行 Azure RBAC 未授權的任何作業。 如需詳細資訊,請參閱 使用共用存取簽章的時機。
在 Azure 入口網站中,移至您的儲存體帳戶,以授予您的 Web 應用程式存取權。 選取左側窗格中的 [存取控制 (IAM)],然後選取 [角色指派]。 您會看到可存取儲存體帳戶的人員清單。 現在您要將角色指派新增至機器人,這是需要存取儲存體帳戶的應用程式服務。 選取 [新增]> [新增角色指派],開啟 [新增角色指派] 頁面。
在 [指派類型] 索引標籤中,選取 [職務類型],然後 [下一步]。
在 [角色] 標籤頁中,從下拉式清單中選取 [儲存體 Blob 資料參與者] 角色,然後選取 [下一步]。
在 [成員] 索引標籤中,選取 [指派>的存取權],然後選取 [成員>選取成員]。 在 [選取受控識別] 視窗中,在 [受控識別] 下拉式清單中尋找並選取為您的 App Service 建立的受控識別。 請按 [選取] 按鈕。
選取 [檢閱並指派],然後再次選取 [檢閱並指派]。
如需詳細步驟,請參閱 使用 Azure 入口網站指派 Azure 角色。
您的 Web 應用程式現在可以存取儲存體帳戶。
存取 Blob 儲存體
DefaultAzureCredential 類別可用來取得程式碼的令牌認證,以授權對 Azure 記憶體的要求。 建立 DefaultAzureCredential 類別的實例,該類別會使用受控識別來擷取令牌,並將其附加至服務用戶端。 下列程式碼範例會取得驗證的權杖憑證,並使用該憑證來建立服務客戶端物件,以上傳新的 Blob。
若要查看此程式代碼作為範例應用程式的一部分,請參閱 GitHub 上的範例。
安裝用戶端程式庫套件
安裝 Blob 記憶體 NuGet 套件 以使用 Blob 記憶體和 適用於 .NET NuGet 套件的 Azure 身分識別用戶端連結庫 ,以使用 Microsoft Entra 認證進行驗證。 使用 .NET 命令列介面 (CLI) 或 Visual Studio 中的 [套件管理員主控台] 來安裝用戶端程式庫。
.NET 命令列介面 (CLI)
開啟命令列,並切換至包含專案檔的目錄。
執行安裝命令。
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
套件管理員主控台
在 Visual Studio 中開啟專案或方案,並使用 [工具>][NuGet 套件管理員套件>管理員控制台 ] 命令開啟控制台。
執行安裝命令。
Install-Package Azure.Storage.Blobs
Install-Package Azure.Identity
範例
using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.IO;
using Azure.Identity;
// Some code omitted for brevity.
static public async Task UploadBlob(string accountName, string containerName, string blobName, string blobContents)
{
// Construct the blob container endpoint from the arguments.
string containerEndpoint = string.Format("https://{0}.blob.core.windows.net/{1}",
accountName,
containerName);
// Get a credential and create a client object for the blob container.
BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
new DefaultAzureCredential());
try
{
// Create the container if it does not exist.
await containerClient.CreateIfNotExistsAsync();
// Upload text to a new block blob.
byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);
using (MemoryStream stream = new MemoryStream(byteArray))
{
await containerClient.UploadBlobAsync(blobName, stream);
}
}
catch (Exception e)
{
throw e;
}
}
清除資源
如果您已完成本教學課程,而不再需要 Web 應用程式或相關聯的資源, 請清除您建立的資源。