共用方式為


在本地開發過程中使用服務主體向 Azure 服務驗證 .NET 應用程式

在本機開發期間,應用程式必須向 Azure 進行驗證,才能存取各種 Azure 服務。 本機驗證的兩個常見方法是 使用開發人員帳戶 或服務主體。 本文說明如何使用應用程式服務主體。 在前面的各節中,您將瞭解:

  • 如何使用 Microsoft Entra 註冊應用程式,以建立服務主體
  • 如何使用Microsoft Entra 群組有效率地管理許可權
  • 如何將角色指派給權限範圍
  • 如何從應用程式程式代碼使用服務主體進行驗證

使用專用的應用程式服務主體可讓您遵守存取 Azure 資源時的最低許可權原則。 許可權僅限於開發期間應用程式的特定需求,以防止意外存取適用於其他應用程式或服務的 Azure 資源。 這種方法也有助於避免當應用程式移至生產環境時發生問題,確保應用程式在開發環境中不會被過度授予權限。

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

在 Azure 中註冊應用程式時,會建立應用程式服務主體。 針對本機開發:

  • 為每個在應用程式上工作的開發人員建立個別的應用程式註冊,以確保每個開發人員都有自己的應用程式服務主體,避免需要共用認證。
  • 為每個應用程式建立個別的應用程式註冊,以限制應用程式的權限僅限於必要的範圍。

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

在 Azure 中註冊應用程式

應用程式服務主體物件可以透過使用 Azure 入口網站或 Azure CLI,在 Azure 中註冊應用程式時所建立。

  1. 在 Azure 入口網站中,使用搜尋列流覽至 [應用程式註冊] 頁面。

  2. 在 [應用程式註冊] 頁面上,選取 [+ 新增註冊]。

  3. 註冊應用程式 頁面上:

    • 針對 [名稱] 字段,輸入包含應用程式名稱和目標環境的描述性值。
    • 針對 支援的帳戶類型,請選取 僅限此組織目錄內的帳戶(僅限 Microsoft 客戶導向 - 單一租戶)或是最符合您需求的選項。
  4. 選取 [] 註冊 [] 以註冊您的應用程式並建立服務主體。

    顯示如何在 Azure 入口網站中建立應用程式註冊的螢幕快照。

  5. 在應用程式的 [應用程式註冊] 頁面上,複製 應用程式識別碼目錄(租使用者)標識碼 並貼到暫存位置,以供稍後在應用程式程式代碼組態中使用。

  6. 選取 [[新增憑證或秘密],以設定應用程式的認證。

  7. 在 [憑證 & 秘密] 頁面上,選取 [+ 新增客戶端密碼]

  8. 在開啟的 [新增客戶端密碼 浮出視窗] 中:

    • 針對 [描述],輸入 Current 的值。
    • 針對 Expires 值,保留建議的預設值 180 天。
    • 選取 並新增 來新增秘密。
  9. 在 [憑證 & 秘密] 頁面上,複製用戶端密碼的 Value 屬性,以供日後步驟使用。

    注意

    客戶端密碼值只會在建立應用程式註冊之後顯示一次。 您可以新增更多客戶端密碼,而不會使此客戶端密碼失效,但無法再次顯示此值。

為本機開發建立 Microsoft Entra 群組

建立Microsoft Entra 群組,以封裝應用程式在本機開發中所需的角色(許可權),而不是將角色指派給個別服務主體物件。 此方法提供下列優點:

  • 每個開發人員都有在群組層級指派的相同角色。
  • 如果應用程式需要新的角色,則只需要將它新增至應用程式的群組。
  • 如果新的開發人員加入小組,則會為開發人員建立新的應用程式服務主體,並新增至群組,確保開發人員有適當的許可權可處理應用程式。
  1. 移至 Azure 入口網站中的 Microsoft Entra ID 概觀頁面。

  2. 從左側功能表中選取 [所有群組]。

  3. 在 [群組] 頁面上,選取 新增群組

  4. 新增群組 頁面上,填寫下列表單欄位:

    • 群組類型:選取 [安全性]。
    • 群組名:輸入包含應用程式或環境名稱參考的群組名稱。
    • 群組描述:輸入說明群組用途的描述。

    顯示如何在 Azure 入口網站中建立群組的螢幕快照。

  5. 選擇 [未選取成員] 連結,位於 [成員] 底下,以將成員新增至群組。

  6. 在開啟的飛出視窗中,搜尋您稍早建立的服務主體,並從篩選的結果中選取它。 在面板底部選擇 [選取] 按鈕以確認您的選擇。

  7. 選取 [建立] 按鈕位於 [新增群組] 頁面底部,以建立群組並返回 [所有群組] 頁面。 如果您沒有看到列出的新群組,請稍候一下並重新整理頁面。

將角色指派給群組

接下來,決定您的應用程式需要哪些資源的角色(許可權),並將這些角色指派給您所建立的 Microsoft Entra 群組。 群組可以在資源、資源群組或訂閱範圍內被指派角色。 此範例示範如何在資源群組範圍中指派角色,因為大部分的應用程式都會將其所有 Azure 資源群組組成單一資源群組。

  1. 在 Azure 入口網站中,流覽至包含您應用程式的資源群組 概觀 頁面。

  2. 從左側導覽中選擇 存取控制(IAM)

  3. 在 [存取控制 (IAM)] 頁面上,選取 [+ 新增],然後從下拉選單中選擇 [新增角色指派]。 [新增角色指派] 頁面提供數個索引標籤來設定和指派角色。

  4. 在 [角色] 索引標籤上,使用搜尋框來找到您想要指派的角色。 選擇角色後,然後選擇 下一步

  5. 在 [成員] 索引標籤上:

    • 針對 指派存取權給 值,請選取 使用者、群組或服務主體
    • 針對[成員] 值,選擇[+ 選取成員] 以便開啟[選取成員] 彈出面板。
    • 搜尋您稍早建立的 Microsoft Entra 群組,並從篩選的結果中選取它。 選擇 以選取群組並關閉彈出面板。
    • 在 [成員] 索引標籤的底部,選取 檢閱 + 指派

    顯示如何將角色指派給 Microsoft Entra 群組的螢幕快照。

  6. 檢閱 + 指派 頁籤上,選取頁面底部的 檢閱 + 指派

設定應用程式環境變數

在執行時,來自 Azure 身份識別庫的特定憑證,例如 DefaultAzureCredentialEnvironmentCredentialClientSecretCredential,依慣例會在環境變數中搜尋服務主體資訊。 使用 .NET 時,有多種方式可以設定環境變數,視您的工具和環境而定。

無論您選擇何種方法,請為服務主體設定下列環境變數:

  • AZURE_CLIENT_ID:用來識別 Azure 中已註冊的應用程式。
  • AZURE_TENANT_ID:Microsoft Entra 租用戶的識別碼。
  • 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": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }

從您的應用程式向 Azure 服務進行驗證

Azure 身分識別連結庫 提供各種 認證—實作 TokenCredential,以支援不同的案例和Microsoft Entra 驗證流程。 後續步驟將示範如何使用 ClientSecretCredential 在本機和生產環境中運用服務主體。

實作程序代碼

新增 Azure.Identity 套件。 在 ASP.NET Core 專案中,也安裝 Microsoft.Extensions.Azure 套件:

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

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

Azure 服務是使用來自各種 Azure SDK 用戶端連結庫的特殊客戶端類別來存取。 這些類別和您自己的自定義服務應該註冊為相依性插入,以便在整個應用程式中使用它們。 在 Program.cs中,完成下列步驟來設定用戶端類別以進行相依性插入和令牌型驗證:

  1. 透過 using 指令包含 Azure.IdentityMicrosoft.Extensions.Azure 命名空間。
  2. 使用對應的 Add前置擴充方法註冊 Azure 服務用戶端。
  3. 使用 tenantIdclientIdclientSecret設定 ClientSecretCredential
  4. ClientSecretCredential 實例傳遞至 UseCredential 方法。
builder.Services.AddAzureClients(clientBuilder =>
{
    var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
    var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
    var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));

    clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
});

UseCredential 方法的替代方法是直接將認證提供給服務用戶端:

var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

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