受保護的 Web API:程式碼設定
若要設定受保護的 Web API 適用的程式碼,請了解:
- 將 API 定義為受保護的由來為何。
- 如何設定持有人權杖。
- 如何驗證權杖。
將 ASP.NET 和 ASP.NET Core API 定義為受保護的由來為何?
如同 Web 應用程式,ASP.NET 和 ASP.NET Core Web API 也會受到保護,因為其控制器動作前面會加上 [Authorize] 屬性。 只有在使用已授權的身分識別呼叫 API 時,才能呼叫控制器動作。
請考量下列問題:
- 只有應用程式才可呼叫 Web API。 API 如何得知加以呼叫的應用程式身分識別為何?
- 如果應用程式代表使用者呼叫 API,使用者的身分識別為何?
持有人權杖
在呼叫應用程式時設定於標頭中的持有人權杖,會保存應用程式身分識別的相關資訊。 此外也會保存使用者的相關資訊,除非 Web 應用程式接受來自精靈應用程式的「服務對服務」呼叫。
下列 C# 程式碼範例說明某個用戶端在透過適用於 .NET 的 Microsoft 驗證程式庫 (MSAL.NET) 取得權杖後呼叫 API 的情形:
var scopes = new[] {$"api://.../access_as_user"};
var result = await app.AcquireToken(scopes)
.ExecuteAsync();
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
重要
用戶端應用程式會向 Microsoft 身分識別平台要求 Web API 的持有人權杖。 此 API 是唯一應驗證權杖並檢視其內含宣告的應用程式。 用戶端應用程式不得嘗試檢查權杖中的宣告。
未來,Web API 可能會要求將權杖加密。 此需求可防止某些人存取可檢視存取權杖的用戶端應用程式。
JwtBearer 設定
本節說明如何設定持有人權杖。
組態檔
只有在您想要接受來自單一租用戶 (企業營運應用程式) 的存取權杖時,才需要指定 TenantId
。 否則,可以保留為 common
。 不同的值可以是:
- A GUID (Tenant ID = Directory ID)
common
可以是任何組織和個人帳戶organizations
可以是任何組織consumers
是 Microsoft 個人帳戶
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "Enter_the_Application_(client)_ID_here",
"TenantId": "common"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
使用 Web API 的自訂應用程式識別碼 URI
如果您已接受註冊 Azure 入口網站時預設的應用程式識別碼 URI,則無須指定對象 (請參閱應用程式識別碼 URI 和範圍)。 否則應新增 Audience
屬性,且其值須為 Web API 的應用程式識別碼 URI。 一般而言,這會從 api://
開始。
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "Enter_the_Application_(client)_ID_here",
"TenantId": "common",
"Audience": "Enter_the_Application_ID_URI_here"
},
}
程式碼初始化
對包含 [Authorize] 屬性的控制器動作呼叫應用程式時,ASP.NET 和 ASP.NET Core 會從授權標頭的持有人權杖中擷取存取權杖。 接著,存取權杖會轉送至 JwtBearer 中介軟體,繼而呼叫適用於 .NET 的 Microsoft IdentityModel 擴充功能。
Microsoft.Identity.Web
Microsoft 建議,在使用 ASP.NET Core 開發 Web API 時,應使用 Microsoft.Identity.Web NuGet 套件。
Microsoft.Identity.Web 可在 ASP.NET Core、驗證中介軟體和適用於 .NET 的 Microsoft 驗證程式庫 (MSAL) 之間提供聯繫管道。 這可以實現更明確、更健全的開發人員體驗,並充分發揮 Microsoft 身分識別平台和 Azure AD B2C 的強大功能。
適用於 .NET 6.0 的 ASP.NET
若要建立使用 Microsoft.Identity.Web 的新 Web API 專案,請使用 .NET 6.0 CLI 或 Visual Studio 中的專案範本。
Dotnet core CLI
# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg
Visual Studio - 若要在 Visual Studio 中建立 Web API 專案,請選取 [檔案]>[新增]>[專案]>[ASP.NET Core Web API]。
.NET CLI 和 Visual Studio 專案範本都會建立看似此程式碼片段的 Program.cs 檔案。 請注意 Microsoft.Identity.Web
using 指示詞和包含驗證和授權的程式碼行。
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();