教學課程:從 .NET Web 應用程式存取 Azure 服務

了解如何使用受控識別,從 Azure App Service 上執行的 Web 應用程式 (不是登入的使用者) 存取 Azure 服務,例如「Azure 儲存體」。 本教學課程舉例示範連線到 Azure 儲存體。

使用本教學課程可安全地存取支援受控識別 (下圖中的 B) 的任何服務

  • Azure 儲存體
  • Azure SQL Database
  • Azure Key Vault

Diagram that shows how to access storage.

您要新增從 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 免費帳戶

必要條件

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

如果您透過 Visual Studio 建立並發佈 Web 應用程式,則系統會為您的應用程式啟用受控識別。 在應用程式服務中,選取左側窗格中的 [身分識別],然後選取 [系統指派]。 確定狀態設為開啟。 否則請選取 [開啟],並選取 [儲存]。 在確認對話方塊中選取 [是],以啟用系統指派的受控識別。 啟用受控識別時,狀態會設定為「開啟」,且物件識別碼可供使用。

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. 讓這些欄位設定為其預設值:

    欄位
    部署模型 Resource Manager
    效能 標準
    帳戶種類 StorageV2 (一般用途 v2)
    複寫 讀取權限異地備援儲存體 (RA-GRS)
    存取層 經常性
  8. 選取 [檢閱 + 建立],以檢閱您的儲存體帳戶設定並建立帳戶。

  9. 選取 建立

若要在 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 容器需要 SAS 權杖,才能執行 Azure RBAC 未授權的任何作業。 如需詳細資訊,請參閱使用共用存取簽章 (SAS) 的時機

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

儲存體 Blob 資料參與者角色指派給訂用帳戶範圍的 App Service。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

您的 Web 應用程式現在可以存取儲存體帳戶。

存取 Blob 儲存體

DefaultAzureCredential 類別是用來取得程式碼的權杖認證,以授權 Azure 儲存體的要求。 建立 DefaultAzureCredential 類別的執行個體,此執行個體會使用受控識別擷取權杖,並將其附加至服務用戶端。 下列程式碼範例會取得已驗證的權杖認證,並用來建立服務用戶端物件,以上傳新的 Blob。

若要在範例應用程式中查看此程式碼,請參閱 GitHub 上的範例

安裝用戶端程式庫套件

安裝 Blob 儲存體 NuGet 套件,以使用 Blob 儲存體和適用於 .NET NuGet 套件的 Azure 身分識別用戶端程式庫驗證 Microsoft Entra 認證。 使用 .NET Core 命令列介面或 Visual Studio 中的套件管理員主控台,安裝用戶端程式庫。

.NET Core 命令列

  1. 開啟命令列,並切換至包含專案檔的目錄。

  2. 執行安裝命令。

    dotnet add package Azure.Storage.Blobs
    
    dotnet add package Azure.Identity
    

套件管理員主控台

  1. 在 Visual Studio 中開啟專案或方案,然後使用工具>NuGet 套件管理員>套件管理員主控台命令開啟主控台。

  2. 執行安裝命令。

    Install-Package Azure.Storage.Blobs
    
    Install-Package Azure.Identity
    

.NET 範例

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

刪除資源群組

Azure 入口網站中,從入口網站功能表選取 [資源群組],然後選取包含您應用程式服務和應用程式服務方案的資源群組。

選取 [刪除資源群組] 來刪除群組及所有資源。

Screenshot that shows deleting the resource group.

此命令可能需要幾分鐘的時間來執行。

下一步

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

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