於本機開發期間使用服務主體向 Azure 服務驗證 .NET 應用程式

開發人員必須在本機工作站上偵錯及測試雲端應用程式。 當應用程式在本機開發期間於開發人員的工作站上執行時,仍必須向應用程式使用的任何 Azure 服務進行驗證。 本文說明如何設定在本機開發期間要使用的專用應用程式服務主體物件。

圖表顯示本機 .NET 應用程式如何透過本機安裝的開發工具,使用開發人員的認證以連線至 Azure。

本機開發專用的應用程式服務主體可讓您遵循應用程式開發期間最低權限的準則。 由於權限的範圍會限定為開發期間應用程式所需的內容,因此應用程式程式碼無法意外存取要供不同應用程式使用的 Azure 資源。 這也可防止應用程式在移至生產環境時發生錯誤,因為應用程式在開發環境中擁有較多權限。

在 Azure 中註冊應用程式時,會為應用程式設定應用程式服務主體。 為本機開發註冊應用程式時,建議您:

  • 為每個在應用程式上作業的開發人員建立個別的應用程式註冊。 這麼做會建立不同的應用程式服務主體,供開發人員於本機開發期間使用,且能避免開發人員針對單一應用程式服務主體共用認證。
  • 為每個應用程式建立個別的應用程式註冊。 這麼做會限制應用程式的權限,使之僅具備所需的權限。

在本機開發期間,會使用應用程式服務主體的身分識別來設定環境變數。 Azure 身分識別會讀取這些環境變數,並使用這項資訊向所需的 Azure 資源驗證應用程式。

1:在 Azure 中註冊應用程式

系統會用於 Azure 註冊的應用程式建立應用程式服務主體物件。 這可透過 Azure 入口網站或 Azure CLI 來完成。

登入 Azure 入口網站並遵循下列步驟。

指示 Screenshot
在 Azure 入口網站中:
  1. 在 Azure 入口網站頂端的搜尋列中輸入應用程式註冊
  2. 在搜尋列下方出現的功能表上的 服務 標題下,選取標有 應用程式註冊 的項目。
顯示如何使用 Azure 入口網站頂端搜尋列尋找並瀏覽至 [應用程式註冊] 分頁的螢幕擷取畫面。
在 [應用程式註冊] 頁面上,選取 [+ 新增註冊] 顯示 [應用程式註冊] 頁面上 [新增註冊] 按鈕位置的螢幕擷取畫面。
在 [註冊應用程式] 頁面中,如下所示填妥表單。
  1. 名稱 → 輸入 Azure 中應用程式註冊的名稱。 建議在此名稱中納入應用程式的名稱、應用程式註冊的使用者,以及 'dev' 之類的識別碼,表示此應用程式註冊係用於本機開發。
  2. 支援的帳戶類型僅限此組織目錄中的帳戶
選取 [註冊] 來註冊您的應用程式,並建立應用程式服務主體。
顯示填寫 [註冊應用程式] 頁面方法的螢幕擷取畫面,方法為提供應用程式名稱,並將支援的帳戶類型指定為僅限此組織目錄中的帳戶。
在您應用程式的 [應用程式註冊] 頁面中:
  1. 應用程式 (用戶端) 識別碼 → 這是應用程式要用來於本機開發期間存取 Azure 的應用程式識別碼。 請將此值複製到文字編輯器內的暫存位置,後續步驟還會用到。
  2. 目錄 (租用戶) 識別碼 → 此值也會於應用程式向 Azure 驗證時派上用場。 請將此值複製到文字編輯器內的暫存位置,後續步驟同樣還會用到。
  3. 用戶端認證 → 您必須為應用程式設定用戶端認證,之後應用程式才能向 Azure 驗證並使用 Azure 服務。 請選取 [新增憑證或祕密],將憑證新增至您的應用程式。
完成應用程式註冊後應用程式註冊頁面的螢幕擷取畫面。此螢幕擷取畫面顯示未來步驟中所需的應用程式識別碼和租用戶識別碼位置。其中也會顯示連結的位置,可用於新增應用程式的應用程式祕密。
在 [憑證與祕密] 頁面中,選取 [+ 新增用戶端密碼] 顯示用於在憑證和祕密頁面上建立新用戶端密碼之連結位置的螢幕擷取畫面。
[新增用戶端密碼] 對話方塊會在頁面右側彈出。 此對話方塊會顯示:
  1. 說明 → 輸入 Current 的值。
  2. 到期 → 選取 24 個月 的值。
選取 [新增] 新增祕密。
螢幕擷取畫面:顯示為應用程式註冊流程所建立應用程式服務主體新增用戶端密碼的分頁。
在 [憑證及秘密] 頁面中,系統會顯示用戶端密碼的值。

請將此值複製到文字編輯器內的暫存位置,後續步驟還會用到。

重要:這是您唯一會看到此值的時間。離開或重新整理此頁面之後,您將無法再次看到此值。 您可以新增其他用戶端密碼而不將此密碼設為無效,但您不會再次看到此值。
顯示已產生用戶端密碼頁面的螢幕擷取畫面。

2 - 建立 Microsoft Entra 群組以進行本機開發

由於處理應用程式的開發人員通常有許多位,建議您在本機開發中建立 Microsoft Entra 群組來封裝應用程式所需的一切角色 (權限),而非將角色指派給個別的服務主體物件。 這些方法提供下列優點:

  • 由於角色是在群組層級指派,因此指派給每位開發人員的角色都能保證相同。
  • 如果應用程式需要新角色,只要在應用程式的群組新增即可。
  • 如有新開發人員加入小組,則系統會為其建立新的應用程式服務主體並新增至群組,確定開發人員具備處理應用程式的適當權限。
指示 Screenshot
在頁面頂端的搜尋方塊中輸入 Microsoft Entra ID,瀏覽至 Azure 入口網站中的 [Microsoft Entra ID] 頁面。 在 [服務] 區段下,選取 [Microsoft Entra ID] 螢幕擷取畫面:顯示如何使用 Azure 入口網站頂端搜尋列來搜尋並瀏覽到 Microsoft Entra ID 頁面。
在 [Microsoft Entra ID] 頁面中,選取左側功能表內的 [群組] 螢幕擷取畫面:顯示 [群組] 功能表項目在 Microsoft Entra 預設目錄頁面左側功能表中的位置。
在 [所有群組] 頁面中,選取 [新增群組] 螢幕擷取畫面:顯示 [新增群組] 按鈕在 [所有群組] 頁面中的位置。
在 [新增群組] 頁面進行下列設定:
  1. [群組類型] → [安全性]
  2. [群組名稱] → 安全性群組的名稱,通常從應用程式名稱建立。 在群組名稱中包含 local-dev 這樣的字串也很有幫助,能夠指出群組的用途。
  3. [群組描述] → 群組用途的描述。
  4. 選取 [成員] 下方的 [未選取任何成員] 連結,為群組新增成員。
螢幕擷取畫面:顯示如何填入表單以為應用程式建立新的 Microsoft Entra 群組。此螢幕擷取畫面也顯示要選取的連結位址,以將成員新增至此群組。
在 [新增成員] 對話方塊進行下列設定:
  1. 使用搜尋方塊篩選清單中的主體名稱列表。
  2. 為此應用程式選取本機開發的應用程式服務主體。 選取物件後,物件會以灰色顯示,並移至對話方塊底部的 [選取的項目] 清單。
  3. 完成後,選取 [選取] 按鈕。
[新增成員] 對話方塊的螢幕擷取畫面,顯示如何選取要納入群組的應用程式服務主體。
回到 [新增群組] 頁面,選取 [建立] 以建立群組。

群組隨即建立,而您會回到 [所有群組] 頁面。 最多可能需要 30 秒,才會顯示群組。 由於 Azure 入口網站中的快取,因此您可能需要重新整理頁面。
[新增群組] 頁面的螢幕擷取畫面,顯示如何選取 [建立] 按鈕完成流程。

3:為應用程式指派角色

接著,請決定應用程式針對哪些資源需要哪些角色 (權限),並將這些角色指派給應用程式。 在此範例中,角色會指派給步驟 2 建立的 Microsoft Entra 群組。 群組可在資源、資源群組或訂閱範圍內獲派其他角色。 此範例會顯示如何在資源群組範圍內指派角色,因為多數應用程式都會將所有 Azure 資源劃分在單一資源群組中。

指示 Screenshot
使用 Azure 入口網站頂端的搜尋方塊,搜尋資源群組的名稱,藉此找出應用程式的資源群組。 選取對話方塊中 資源群組 標題下方的資源群組名稱,瀏覽至您的資源群組。 螢幕擷取畫面:顯示如何使用 Azure 入口網站頂端的搜尋方塊,找出並瀏覽至您想指派角色 (權限) 的資源群組。
在資源群組分頁中,從左側功能表選取 存取控制 (IAM) 資源群組頁面的螢幕擷取畫面,顯示 [存取控制 (IAM)] 功能表項目的位置。
存取控制 (IAM) 分頁上:
  1. 選取 [角色指派] 索引標籤。
  2. 從頂端功能表選取 [+ 新增],然後從產生的下拉功能表中選取 [新增角色指派]
螢幕擷取畫面:顯示如何瀏覽至角色指派索引標籤,以及用以將角色指派新增至資源群組按鈕位置。
新增角色指派 分頁列出所有可指派至資源群組之角色的清單。
  1. 請善用搜尋方塊,將清單篩選為更易於管理的大小。 此範例顯示如何針對儲存體 Blob 角色進行篩選。
  2. 選取您要指派的角色。
選取 [下一步] 前往下一個畫面。
螢幕擷取畫面:顯示如何篩選並選取要新增至資源群組的角色指派。
下一個 新增角色指派 分頁能讓您指定要指派角色的使用者。
  1. 選取 [存取權指派對象為] 下的 [使用者、群組或服務主體]
  2. 選取 [成員] 下的 [+ 選取成員]
對話方塊會在 Azure 入口網站的右側開啟。
螢幕擷取畫面:顯示用來將角色指派給 Microsoft Entra 群組的選項按鈕,以及用來選取群組以指派角色的連結。
在 [選取成員] 對話方塊進行下列設定:
  1. [選取] 文字輸入框可用來篩選訂閱中的使用者及群組清單。 如有需要,請輸入您為應用程式所建立本機開發 Microsoft Entra 群組的前幾個字元。
  2. 選取與您應用程式相關聯的本機開發 Microsoft Entra 群組。
選取對話方塊底部的 [選取] 來繼續。
螢幕擷取畫面:顯示如何在 [選取成員] 對話方塊中為應用程式篩選並選取 Microsoft Entra 群組。
Microsoft Entra 群組會在 [新增角色指派] 畫面上顯示為已選取。 選取 [檢閱 + 指派] 移至最終分頁,然後再次選取 [檢閱 + 指派] 完成此流程。 螢幕擷取畫面:顯示已完成的 [新增角色指派] 頁面,以及用來完成流程的 [檢閱 + 指派] 按鈕位置。

4:設定應用程式環境變數

在執行階段,DefaultAzureCredential 會在環境變數集合中尋找服務主體資訊。 使用 .NET 時設定環境變數的方法有很多,視您使用的工具和環境而定。

無論您選擇哪一種方法,請在使用服務主體時設定下列環境變數:

  • AZURE_CLIENT_ID → 應用程式識別碼的值。
  • AZURE_TENANT_ID → 租用戶識別碼的值。
  • AZURE_CLIENT_SECRET → 為應用程式產生的密碼/認證。

在本機使用 Visual Studio 時,可在專案 Properties 資料夾的 launchsettings.json 檔案內設定環境變數。 應用程式啟動時,系統會自動提取這些值。 請注意,這些設定不會在您部署應用程式時跟著移動,因此您必須在目標裝載環境中設定環境變數。

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    }
  }

5:在應用程式中實作 DefaultAzureCredential

DefaultAzureCredential 是向 Microsoft Entra 驗證的固定按順序機制序列。 每個驗證機制都是衍生自 TokenCredential 類別的類別,稱為「認證」。 在執行階段中,DefaultAzureCredential 會嘗試使用第一個認證進行驗證。 如果該認證無法取得存取權杖,則會嘗試序列中的下一個認證,依序進行,直到成功取得存取權杖為止。 因此,您的應用程式可以在相異環境中使用不同的認證,而不需要撰寫環境特定程式碼。

DefaultAzureCredential 尋找認證的順序和位置,可在 DefaultAzureCredential (英文) 中找到。

若要使用 DefaultAzureCredential,請新增 Azure.Identity,並選擇性將 Microsoft.Extensions.Azure 套件新增至您的應用程式:

在您選擇的終端機中,瀏覽至應用程式專案目錄,然後執行下列命令:

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

使用來自各種 Azure SDK 用戶端程式庫的特殊用戶端類別以存取 Azure 服務。 這些類別和您自訂的服務都應註冊,使其可在應用程式中透過相依性插入來存取。 在 Program.cs 中,完成下列步驟以註冊用戶端類別和 DefaultAzureCredential

  1. 透過 using 指示詞包含 Azure.IdentityMicrosoft.Extensions.Azure 命名空間。
  2. 使用對應的以 Add 為前置詞擴充方法,註冊 Azure 服務用戶端。
  3. DefaultAzureCredential 的執行個體傳遞至 UseCredential 方法。

例如:

using Microsoft.Extensions.Azure;
using Azure.Identity;

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));
    clientBuilder.UseCredential(new DefaultAzureCredential());
});

UseCredential 的替代方法是直接具現化 DefaultAzureCredential

using Azure.Identity;

builder.Services.AddSingleton<BlobServiceClient>(_ =>
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new DefaultAzureCredential()));

在本機開發工作站上執行上述程式碼時,便會在環境變數中尋找應用程式服務主體,或在本機安裝的開發工具 (例如 Visual Studio) 中尋找一組開發人員認證。 在本機開發期間,您可以使用任一方法以向 Azure 資源驗證應用程式。

部署至 Azure 時,這同一組程式碼也可向其他 Azure 資源驗證您的應用程式。 DefaultAzureCredential 可擷取環境設定與受控識別設定,以便自動向其他服務進行驗證。