共用方式為


快速入門:使用 Microsoft 身分識別平台 保護 ASP.NET Core Web API

歡迎使用! 這可能不是您預期的頁面。 當我們處理修正時,此鏈接應該會帶您前往正確的文章:

快速入門:呼叫受 Microsoft 身分識別平台 保護的 ASP.NET Core Web API

我們為不便道歉,並感謝您的耐心,同時我們努力解決這個問題。

下列快速入門會使用 ASP.NET Core Web API 程式代碼範例來示範如何限制授權帳戶的資源存取。 此範例支援任何 Microsoft Entra 組織中的個人 Microsoft 帳戶和帳戶授權。

必要條件

步驟 1:註冊應用程式

首先,在 Microsoft Entra 租用戶中註冊 Web API,並遵循下列步驟來新增範圍:

  1. 以至少應用程式 管理員 istrator 身分登入 Microsoft Entra 系統管理中心
  2. 流覽至 [身分>識別應用程式> 應用程式註冊]。
  3. 選取新增註冊
  4. 針對 [ 名稱],輸入應用程式的名稱。 例如,輸入 AspNetCoreWebApi-Quickstart。 應用程式的使用者會看到此名稱,稍後可以變更。
  5. 選取註冊
  6. 在 [管理] 底下,選取 [公開 API>新增範圍]。 針對 [應用程式識別碼 URI],選取 [ 儲存後繼續],接受預設值,然後輸入下列詳細數據:
  • 範圍名稱access_as_user
  • 神秘 可以同意?管理員 和使用者
  • 管理員 同意顯示名稱Access AspNetCoreWebApi-Quickstart
  • 管理員 同意描述Allows the app to access AspNetCoreWebApi-Quickstart as the signed-in user.
  • 使用者同意顯示名稱Access AspNetCoreWebApi-Quickstart
  • 使用者同意描述Allow the application to access AspNetCoreWebApi-Quickstart on your behalf.
  • 狀態已啟用
  1. 選取 [新增範圍 ] 以完成新增範圍。

步驟 2:下載 ASP.NET Core 專案

從 GitHub 下載 ASP.NET Core 解決方案

注意

程式代碼範例目前以 ASP.NET Core 3.1 為目標。 此範例可以更新為使用 .NET Core 6.0,並涵蓋在下列步驟中: 將範例程式代碼更新為 ASP.NET Core 6.0。 本快速入門將在近期內淘汰,並將更新為使用 .NET 6.0。

步驟 3:設定 ASP.NET Core 專案

在此步驟中,範例程式代碼會設定為使用稍早建立的應用程式註冊。

  1. .zip 檔案解壓縮到接近磁碟根目錄的本機資料夾,以避免 Windows 路徑長度限制所造成的錯誤。 例如,擷取至 C:\Azure-Samples

  2. 在程式代碼編輯器的 webapi 資料夾中開啟方案。

  3. appsettings.json中,取代、 和 TenantId的值ClientId

    "ClientId": "Enter_the_Application_Id_here",
    "TenantId": "Enter_the_Tenant_Info_Here"
    
    • Enter_the_Application_Id_Here 是已註冊應用程式的應用程式 (用戶端) 識別碼。
    • 取代為 Enter_the_Tenant_Info_Here 下列其中一項:
      • 如果應用程式只支援此組織目錄中的帳戶,請將此值取代為目錄(租使用者)識別碼(GUID)或租使用者名稱(例如 )。 contoso.onmicrosoft.com 您可以在應用程式的 [概觀 ] 頁面上找到目錄(租使用者)標識碼。
      • 如果應用程式支援 任何組織目錄中的帳戶,請將此值取代為 organizations
      • 如果應用程式支援 [所有 Microsoft 帳戶使用者],請將此值保留為 common

在本快速入門中,請勿變更appsettings.json檔案中的任何其他值。

步驟 4:將範例程式代碼更新為 ASP.NET Core 6.0

若要更新此程式代碼範例以 ASP.NET Core 6.0 為目標,請遵循下列步驟:

  1. 開啟 webapi.csproj
  2. 移除下列程式碼:
<TargetFramework>netcoreapp3.1</TargetFramework>
  1. 在其位置新增下列這一行:
<TargetFramework>netcoreapp6.0</TargetFramework>

此步驟可確保範例是以 .NET Core 6.0 架構為目標。

步驟 5:執行範例

  1. 開啟終端機,並將目錄變更為項目資料夾。

    cd webapi
    
  2. 執行下列命令來建置解決方案:

dotnet run

如果建置成功,則會顯示下列輸出:

Building...
info: Microsoft.Hosting.Lifetime[0]
    Now listening on: https://localhost:{port}
info: Microsoft.Hosting.Lifetime[0]
    Now listening on: http://localhost:{port}
info: Microsoft.Hosting.Lifetime[0]
    Application started. Press Ctrl+C to shut down.
...

範例的運作方式

啟動類別

Microsoft.AspNetCore.Authentication 中間件會使用Startup裝載進程啟動時執行的類別。 在其 ConfigureServices 方法中AddMicrosoftIdentityWebApi,會呼叫 Microsoft.Identity.Web 所提供的擴充方法。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApi(Configuration, "AzureAd");
    }

方法 AddAuthentication() 會設定服務以新增 JwtBearer 型驗證。

包含 .AddMicrosoftIdentityWebApi 的行會將 Microsoft 身分識別平台 授權新增至 Web API。 然後,它會設定為根據 appsettings.json組態檔區段中的資訊AzureAD,驗證 Microsoft 身分識別平台 所簽發的存取令牌:

appsettings.json鍵 描述
ClientId 已註冊之應用程式的應用程式(用戶端)標識碼。
Instance 用戶要驗證的安全性令牌服務 (STS) 端點。 此值通常是 https://login.microsoftonline.com/,表示 Azure 公用雲端。
TenantId 租使用者或其租使用者標識碼的名稱(GUID),或 common 以公司或學校帳戶或 Microsoft 個人帳戶登入使用者。

方法 Configure() 包含兩個重要的方法和 app.UseAuthentication() ,可 app.UseAuthorization()啟用其具名功能:

// The runtime calls this method. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // more code
    app.UseAuthentication();
    app.UseAuthorization();
    // more code
}

保護控制器、控制器的方法或Razor頁面

控制器或控制器方法可以使用 屬性來保護 [Authorize] 。 此屬性只允許已驗證的使用者,以限制對控制器或方法的存取。 如果使用者未通過驗證,可以啟動驗證挑戰來存取控制器。

namespace webapi.Controllers
{
    [Authorize]
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase

控制器中的範圍驗證

API 中的程式碼會使用 HttpContext.VerifyUserHasAnyAcceptedScope> (scopeRequiredByApi);來驗證所需的範圍是否位於權杖中:

namespace webapi.Controllers
{
    [Authorize]
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        // The web API will only accept tokens 1) for users, and 2) having the "access_as_user" scope for this API
        static readonly string[] scopeRequiredByApi = new string[] { "access_as_user" };

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);

            // some code here
        }
    }
}

說明與支援 

如果您需要協助、想要回報問題,或想要了解支援選項,請參閱 開發人員的說明和支援。

下一步

下列 GitHub 存放庫包含 ASP.NET Core Web API 程式代碼範例指示,以及示範如何達成下列作業的更多範例:

  • 將驗證新增至新的 ASP.NET Core Web API。
  • 從傳統型應用程式呼叫 Web API。
  • 呼叫下游 API,例如 Microsoft Graph 和其他 Microsoft API。