共用方式為


呼叫 Web API 的 Web 應用程式:程式碼設定

適用於帶有白色核取記號符號的綠色圓圈,表示以下內容適用於員工租戶。 員工租戶 (瞭解更多資訊

本文將說明如何設定應用程式程序代碼,並修改 Web 應用程式,使其不僅會登入使用者,而且現在也會呼叫 Web API。 您建立的應用程式會使用 OAuth 2.0 授權碼流程 來登入使用者。 此流程包含兩個步驟:

  1. 要求授權碼。 此部分會將與使用者的私人對話委派給 Microsoft 身分識別平台。 在該對話期間,使用者會進行登入,並同意使用 Web API。 當私人對話成功完成時,Web 應用程式即會在其重新導向 URI 上收到授權碼。
  2. 透過兌換授權碼來申請 API 的存取權杖。

必要條件

  • 具有有效訂閱的 Azure 帳戶。 免費建立帳戶。 此帳戶必須具有管理應用程式的許可權。 使用註冊應用程式所需的下列任何角色:
    • 應用程式管理員
    • 應用程式開發人員
  • Microsoft Entra 系統管理中心註冊新的應用程式, 僅針對此組織目錄中的帳戶進行設定。 如需詳細資訊 ,請參閱註冊應用程式 。 從應用程式 [概 ] 頁面記錄下列值,以供稍後使用:
    • 應用程式 (用戶端) 識別碼
    • 目錄(租戶)識別碼

支援 Web 應用程式的 Microsoft 程式庫

下列 Microsoft 程式庫支援 Web 應用程式:

語言 / 架構 專案進行中
GitHub
套件 開始
開始
登入使用者 存取 Web API 正式發行 (GA)
公開預覽1
.NET MSAL.NET Microsoft.Identity.Client 程式庫無法要求供使用者登入的識別碼權杖。 程式庫可以要求受保護 Web API 的存取權杖。 GA
.NET Microsoft.IdentityModel Microsoft.IdentityModel 程式庫無法要求供使用者登入的識別碼權杖。 2 程式庫無法要求受保護 Web API 的存取權杖。 2 GA
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web 快速入門 函式庫可以要求供使用者登入的 ID 權杖。 程式庫可以要求受保護 Web API 的存取權杖。 GA
JAVA MSAL4J msal4j 快速入門 函式庫可以要求供使用者登入的 ID 權杖。 程式庫可以要求受保護 Web API 的存取權杖。 GA
春天 spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory 教學課程 函式庫可以要求供使用者登入的 ID 權杖。 程式庫可以要求受保護 Web API 的存取權杖。 GA
Node.js MSAL 節點 msal-node 快速入門 函式庫可以要求供使用者登入的 ID 權杖。 程式庫可以要求受保護 Web API 的存取權杖。 GA
Python MSAL Python msal 函式庫可以要求供使用者登入的 ID 權杖。 程式庫可以要求受保護 Web API 的存取權杖。 GA
Python 身份 身份 快速入門 函式庫可以要求供使用者登入的 ID 權杖。 程式庫可以要求受保護 Web API 的存取權杖。 --

(1)線上服務的通用授權條款適用於公開預覽中的程式庫。

(2) Microsoft.IdentityModel 程式庫只會驗證權杖,無法要求識別碼或存取權杖。

選取感興趣的平台索引標籤:

用戶端密碼或用戶端憑證

如果您的 Web 應用程式現在呼叫下游 Web API,請提供 appsettings.json 檔案中的用戶端密碼或用戶端憑證。 您也可以新增一個區段,以指定:

  • 下游 Web API 的 URL
  • 呼叫 API 所需的範圍

在下列範例中,GraphBeta 區段會指定這些設定。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

注意

您可以提出一組用戶端憑證,其中包括無憑證的解決方案,例如 Azure Kubernetes 的工作負載身份聯盟。 舊版的 Microsoft.Identity.Web 在單一屬性 "ClientSecret" 中表示用戶端密碼,而不是 "ClientCredentials"。 這仍支援回溯相容性,但您無法同時使用 "ClientSecret" 屬性和 "ClientCredentials" 集合。

您可以提供用戶端憑證,而不是用戶端密碼。 下列程式碼片段顯示如何使用儲存在 Azure Key Vault 中的憑證。

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

警告

如果您忘記將 Scopes 變更為陣列,則在嘗試使用 IDownstreamApi 範圍時,會顯示 null,而 IDownstreamApi 會嘗試對下游 API 進行匿名 (未驗證) 呼叫,這會導致 401/unauthenticated

Microsoft.Identity.Web 提供數種方式來描述憑證 (透過設定或程式碼)。 如需詳細資訊,請參閱 GitHub 上的 Microsoft.Identity.Web - 使用憑證

修改Startup.cs檔案

您的 Web 應用程式需要取得下游 API 的令牌。 您可以在 .EnableTokenAcquisitionToCallDownstreamApi() 後面加上 .AddMicrosoftIdentityWebApp(Configuration) 行來進行指定。 這行程式碼會顯示您可以在控制器和頁面動作中使用的 IAuthorizationHeaderProvider 服務。 不過,下列兩個選項可讓您更輕鬆地完成。 您也需要在 .AddInMemoryTokenCaches() 中選擇權杖快取實作,例如

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

傳遞給 EnableTokenAcquisitionToCallDownstreamApi 的範圍是選擇性的,並使您的 Web 應用程式能夠在使用者登入時要求範圍並徵得使用者對這些範圍的同意。 如果您未指定範圍,則 Microsoft.Identity.Web 會啟用累加式同意體驗。

Microsoft.Identity.Web 提供兩種機制,讓您不需要取得權杖,即可從 Web 應用程式呼叫 Web API。 您選擇的選項取決於您是否要呼叫 Microsoft Graph 或其他 API。

選項 1:呼叫 Microsoft Graph

如果您想要呼叫 Microsoft Graph,Microsoft.Identity.Web 會讓您在 API 動作中直接使用 GraphServiceClient (由 Microsoft Graph SDK 公開)。 若要將 Microsoft Graph 功能公開:

  1. Microsoft.Identity.Web.GraphServiceClient NuGet 套件新增至專案。

  2. .AddMicrosoftGraph() 檔案的 .EnableTokenAcquisitionToCallDownstreamApi() 後面加入 .AddMicrosoftGraph() 有數個覆寫選項。 使用以設定區段作為參數的覆寫,程式碼就會變成:

    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

選項 2:呼叫 Microsoft Graph 以外的下游 Web API

若要呼叫 Microsoft Graph 以外的 API,Microsoft.Identity.Web 可讓您在 API 動作中使用 IDownstreamApi 介面。 若要使用此介面:

  1. Microsoft.Identity.Web.DownstreamApi NuGet 套件新增至您的專案。

  2. .AddDownstreamApi() 檔案的 .EnableTokenAcquisitionToCallDownstreamApi() 後面加入 .AddDownstreamApi() 有兩個引數,且顯示在下列程式碼片段中:

    • 服務的名稱 (API),用於控制器動作以參考對應的組態
    • 此組態區段表示用來呼叫下游 Web API 的參數。
    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

摘要

如同 Web API,您可以選擇各種權杖快取實作。 如需詳細資訊,請參閱 GitHub 上的 Microsoft.Identity.Web - 權杖快取序列化

下圖顯示 Microsoft.Identity.Web 的各種可能性,以及其對Startup.cs 檔案的影響:

此方塊圖顯示 startup dot CS 中的服務設定選項,可供呼叫 Web API 及指定權杖快取實作

注意

若要完全了解此處的程式碼範例,請熟悉 ASP.NET Core 基本概念,特別是相依性插入選項

兌換授權碼的程式碼

Microsoft.Identity.Web 會透過設定正確的 Open ID Connect 設定、訂閱授權碼接收事件,以及兌換授權碼來簡化程式碼。 兌換授權碼無需額外的程式碼。 如需其運作方式的詳細資訊,請參閱 Microsoft.Identity.Web 原始程式碼

機密用戶端應用程式也可透過使用用戶端憑證或用戶端聲明來證明其身分識別,而不是使用用戶端密碼。 使用用戶端判斷提示是進階案例,用戶端判斷提示中提供詳細的說明。

令牌快取

重要

Web 應用程式或 Web API 的權杖快取實作方式與桌面應用程式的實作方式不同,後者通常是以檔案為基礎。 基於安全性和效能考量,確保每個使用者帳戶都有一個 Token 快取,對於 Web 應用程式和 Web API 相當重要。 您必須為每個帳戶序列化令牌快取。

ASP.NET Core 教程使用依賴注入,讓您在應用程式的 Startup.cs 檔案中決定權杖快取的實作方式。 Microsoft.Identity.Web 隨附權杖快取序列化中所述的預建權杖快取序列化程式。 一個有趣的可能性是選擇 ASP.NET Core 分散式記憶體快取

// Use a distributed token cache by adding:
    services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(
                initialScopes: new string[] { "user.read" })
            .AddDistributedTokenCaches();

// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();

// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
 options.Configuration = "localhost";
 options.InstanceName = "SampleInstance";
});

// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
 options.ConnectionString = _config["DistCache_ConnectionString"];
 options.SchemaName = "dbo";
 options.TableName = "TestCache";
});

如需有關權杖快取提供者的詳細資訊,請參閱 Microsoft.Identity.Web 的權杖快取序列化一文,以及 Web 應用程式教學課程的 ASP.NET Core Web 應用程式教學課程 | 權杖快取階段。

後續步驟

此時,當使用者登入時,權杖即會儲存在權杖快取中。 讓我們來看看其接著在 Web 應用程式其他部分中使用的方式。

在進行全域註銷時,從快取中移除帳戶。