Share via


使用受控識別從 Web 應用程式存取 Azure 儲存體

瞭解如何使用受控識別,存取在 Azure App 服務 上執行的 Web 應用程式(不是登入使用者)Azure 儲存體。

Diagram that shows how to access storage.

您想要從 Web 應用程式新增 Azure 數據平面的存取權(Azure 儲存體、Azure SQL 資料庫、Azure 金鑰保存庫 或其他服務)。 您可以使用共用密鑰,但您必須擔心誰可以建立、部署和管理秘密的操作安全性。 也可以將金鑰簽入 GitHub,駭客知道如何掃描。 讓 Web 應用程式存取數據更安全的方法,就是使用 受控識別

來自 Microsoft Entra ID 的受控識別可讓 App Service 透過角色型存取控制 (RBAC) 存取資源,而不需要應用程式認證。 將受控識別指派給 Web 應用程式之後,Azure 會負責建立和散發憑證。 人員 不必擔心管理秘密或應用程式認證。

在本教學課程中,您會了解如何:

  • 在 Web 應用程式上建立系統指派的受控識別。
  • 建立記憶體帳戶和 Azure Blob 儲存體容器。
  • 使用受控識別從 Web 應用程式存取記憶體。

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

在應用程式上啟用受控識別

如果您透過Visual Studio建立及發佈 Web 應用程式,則會為您在應用程式上啟用受控識別。 在您的 App Service 中,選取 左窗格中的 [身分識別 ],然後選取 [ 系統指派]。 確認 [ 狀態 ] 已設定為 [ 開啟]。 如果沒有,請選取 [ 儲存 ],然後選取 [ ] 以啟用系統指派的受控識別。 啟用受控識別時,狀態會設定為 [開啟 ],而且可以使用對象標識碼。

Screenshot that shows the System assigned identity option.

此步驟會建立新的物件標識碼,與在 [驗證/授權 ] 窗格中建立的應用程式識別碼不同。 複製系統指派受控識別的物件標識碼。 稍後您將需要此資訊。

建立記憶體帳戶和 Blob 儲存體 容器

現在您已準備好建立記憶體帳戶和 Blob 儲存體 容器。

每個記憶體帳戶都必須屬於 Azure 資源群組。 資源群組是用來群組 Azure 服務的邏輯容器。 當您建立記憶體帳戶時,您可以選擇建立新的資源群組或使用現有的資源群組。 本文說明如何建立新的資源群組。

一般用途 v2 儲存器帳戶可讓您存取所有 Azure 儲存體 服務:Blob、檔案、佇列、數據表和磁碟。 這裡概述的步驟會建立一般用途 v2 儲存體帳戶,但建立任何類型的記憶體帳戶的步驟很類似。

Azure 儲存體 中的 Blob 會組織成容器。 您必須先建立容器,才能在本教學課程稍後上傳 Blob。

若要在 Azure 入口網站 中建立一般用途 v2 儲存體帳戶,請遵循下列步驟。

  1. 在 Azure 入口網站功能表上,選取 [所有服務]。 在資源清單中,輸入 儲存體 帳戶。 當您開始輸入時,清單會根據您的輸入進行篩選。 選取 [儲存體帳戶]

  2. 出現的 [儲存體 帳戶] 視窗中,選取 [建立]。

  3. 選取要在其中建立儲存體帳戶的訂用帳戶。

  4. 在 [ 資源群組 ] 字段下,從下拉功能表中選取包含 Web 應用程式的資源群組。

  5. 接下來,輸入記憶體帳戶的名稱。 您選擇的名稱在整個 Azure 中必須是唯一的。 名稱的長度也必須介於 3 到 24 個字元之間,而且只能包含數位和小寫字母。

  6. 選取記憶體帳戶的位置,或使用預設位置。

  7. 針對 [效能],選取 [ 標準] 選項。

  8. 針對 [ 備援],從下拉式清單中選取 [ 本地備援記憶體 ][LRS] 選項。

  9. 選取 [ 閱] 以檢閱您的記憶體帳戶設定,並建立帳戶。

  10. 選取 建立

若要在 Azure 儲存體 中建立 Blob 儲存體 容器,請遵循下列步驟。

  1. 移至 Azure 入口網站 中的新記憶體帳戶。

  2. 在記憶體帳戶的左側功能表中,捲動至 [資料記憶體] 區段,然後選取 [ 容器]。

  3. 選取 [ + 容器] 按鈕。

  4. 輸入新容器的名稱。 容器名稱必須是小寫,以字母或數字開頭,並且只能包含字母、數字和虛線 (-) 字元。

  5. 設定容器的公用存取層級。 預設層級為 [私人 (無匿名存取)]

  6. 選取 [建立] 建立容器。

授與記憶體帳戶的存取權

您必須先授與 Web 應用程式對記憶體帳戶的存取權,才能建立、讀取或刪除 Blob。 在上一個步驟中,您已使用受控識別設定在 App Service 上執行的 Web 應用程式。 使用 Azure RBAC,您可以將受控識別存取權授與另一個資源,就像任何安全性主體一樣。 儲存體 Blob 資料參與者角色會提供 Web 應用程式(以系統指派的受控識別表示)讀取、寫入和刪除 Blob 容器和數據存取權。

注意

Azure RBAC 不支援私人 Blob 容器上的某些作業,例如在帳戶之間檢視 Blob 或複製 Blob。 具有私人存取層級的 Blob 容器需要 AZURE RBAC 未授權之任何作業的 SAS 令牌。 如需詳細資訊,請參閱 使用共用存取簽章的時機。

在 Azure 入口網站,移至您的記憶體帳戶,以授與 Web 應用程式存取權。 選取 左窗格中的 [訪問控制][IAM] ,然後選取 [ 角色指派]。 您會看到可存取記憶體帳戶的人員清單。 現在您想要將角色指派新增至機器人,也就是需要存取記憶體帳戶的應用程式服務。 選取 [新增>角色指派] 以開啟 [新增角色指派] 頁面。

  1. 在 [指派類型] 索引標籤中,選取 [作業函式類型],然後選取 [下一步]。

  2. 在 [角色] 索引標籤中,從下拉式清單中選取 [儲存體 Blob 數據參與者角色],然後選取 [下一步]。

  3. 在 [成員] 索引標籤中,選取 [指派對 ->受控識別的存取權],然後選取 [成員] ->[選取成員]。 在 [ 選取受控識別] 視窗中,在 [受控識別] 下拉式 列表中尋找並選取為 App Service 建立的 受控識別 。 選取 [選取] 按鈕。

  4. 選取 [ 檢閱並指派 ],然後選取 [ 檢閱] 並再次指派 一次。

如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

您的 Web 應用程式現在具有記憶體帳戶的存取權。

存取 Blob 儲存體

DefaultAzureCredential 類別可用來取得程式碼的令牌認證,以授權要求 Azure 儲存體。 建立DefaultAzureCredential類別的實例,該類別會使用受控識別來擷取令牌,並將其附加至服務用戶端。 下列程式代碼範例會取得已驗證的令牌認證,並使用它來建立服務客戶端物件,以上傳新的 Blob。

若要查看此程式代碼作為範例應用程式的一部分,請參閱 GitHub 上的範例。

安裝客戶端連結庫套件

安裝 Blob 儲存體 NuGet 套件,以使用 Blob 儲存體 和適用於 .NET NuGet 套件Azure 身分識別客戶端連結庫,以使用 Microsoft Entra 認證進行驗證。 在 Visual Studio 中使用 .NET 命令行介面 (CLI) 或 封裝管理員 控制台來安裝用戶端連結庫。

.NET CLI

開啟命令行,並切換至包含項目檔的目錄。

執行安裝命令。

dotnet add package Azure.Storage.Blobs

dotnet add package Azure.Identity

套件管理員主控台

在 Visual Studio 中開啟專案或方案,並使用 [工具>] NuGet 封裝管理員> 封裝管理員 Console 命令開啟控制台。

執行安裝命令。

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 應用程式或相關聯的資源, 請清除您建立的資源。

下一步