Untuk mengonfigurasi kode untuk API web yang dilindungi, pahami:
Apa yang mendefinisikan API sebagai dilindungi.
Cara mengonfigurasi token pembawa.
Cara memvalidasi token.
Apa yang mendefinisikan ASP.NET dan ASP.NET Core API sebagai dilindungi?
Seperti aplikasi web, api web ASP.NET dan ASP.NET Core dilindungi karena tindakan pengontrolnya diawali dengan atribut [Otorisasi ]. Tindakan pengontrol hanya dapat dipanggil jika API dipanggil dengan identitas yang sah.
Pertimbangkan pertanyaan-pertanyaan berikut:
Hanya aplikasi dapat memanggil API web. Bagaimana cara API mengetahui identitas aplikasi yang memanggilnya?
Jika aplikasi memanggil API atas nama pengguna, apa identitas pengguna?
Token pembawa
Token pembawa yang diatur di dalam header saat aplikasi itu dipanggil menyimpan informasi tentang identitas aplikasi. Token ini juga menyimpan informasi tentang pengguna kecuali aplikasi web menerima panggilan layanan ke layanan dari aplikasi daemon.
Berikut ini adalah contoh kode C# yang menunjukkan klien yang memanggil API setelah memperoleh token dengan Microsoft Authentication Library for .NET (MSAL.NET):
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);
Penting
Aplikasi klien meminta token pembawa ke platform identitas Microsoft untuk API web. API adalah satu-satunya aplikasi yang harus memverifikasi token dan melihat klaim yang dikandungnya. Aplikasi klien tidak boleh mencoba memeriksa klaim yang ada di dalam token.
Di masa mendatang, API web mungkin mengharuskan token dienkripsi. Persyaratan ini akan mencegah akses untuk aplikasi klien yang dapat melihat token akses.
Konfigurasi JwtBearer
Bagian ini menjelaskan cara mengonfigurasi token pembawa.
File konfigurasi
Anda perlu menentukan satu-satunya TenantId jika Anda ingin menerima token akses dari satu penyewa (aplikasi lini bisnis). Jika tidak, itu dapat dibiarkan sebagai common. Nilai yang berbeda dapat berupa:
GUID (ID Penyewa = ID Direktori)
common dapat berupa akun organisasi dan pribadi apa pun
Jika Anda telah menerima URI ID Aplikasi yang diusulkan oleh portal Microsoft Azure, Anda tidak perlu menentukan audiens (lihat URI ID Aplikasi dan cakupan). Jika tidak, Anda harus menambah properti Audience yang nilainya adalah URI ID Aplikasi untuk API web Anda. Ini biasanya dimulai dengan api://.
Ketika aplikasi dipanggil pada tindakan pengontrol yang memegang atribut [Authorize], ASP.NET dan ASP.NET Core mengekstrak token akses dari token pembawa header Otorisasi. Token akses kemudian diteruskan ke middleware JwtBearer, yang memanggil Microsoft IdentityModel Extensions for .NET.
Microsoft menyarankan Anda menggunakan paket Microsoft.Identity.Web NuGet saat mengembangkan API web dengan ASP.NET Core.
Microsoft.Identity.Web menyediakan perekat antara ASP.NET Core, middleware autentikasi, dan Microsoft Authentication Library (MSAL) untuk .NET. Ini memungkinkan pengalaman pengembang yang lebih jelas dan lebih kuat dan memanfaatkan kekuatan platform identitas Microsoft dan Azure AD B2C.
ASP.NET untuk .NET 6.0
Untuk membuat proyek API web baru yang menggunakan Microsoft.Identity.Web, gunakan templat proyek di CLI .NET 6.0 atau Visual Studio.
CLI dotnet core
# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg
Visual Studio - Untuk membuat proyek API web di Visual Studio, pilih File>Baru>Proyek>ASP.NET Core Web API.
Templat proyek .NET CLI dan Visual Studio membuat file Program.cs yang terlihat mirip dengan cuplikan kode ini. Perhatikan Microsoft.Identity.Web menggunakan direktif dan baris yang berisi autentikasi dan otorisasi.
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();
Microsoft.Identity.Web.OWIN menyediakan lem antara ASP.NET, middleware autentikasi ASP.NET, dan Microsoft Authentication Library (MSAL) untuk .NET. Ini memungkinkan pengalaman pengembang yang lebih jelas dan lebih kuat dan memanfaatkan kekuatan platform identitas Microsoft dan Azure AD B2C.
Ini menggunakan file konfigurasi yang sama dengan ASP.NET Core (appsettings.json) dan Anda perlu memastikan bahwa file ini disalin dengan output proyek Anda (salinan properti selalu di properti file di Visual Studio atau di .csproj)
Microsoft.Identity.Web.OWIN menambahkan metode ekstensi ke IAppBuilder bernama AddMicrosoftIdentityWebApi. Metode ini mengambil sebagai parameter instans OwinTokenAcquirerFactory yang Anda dapatkan panggilannya OwinTokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>() dan yang menampilkan instans IServiceCollection tempat Anda dapat menambahkan banyak layanan untuk memanggil API hilir atau mengonfigurasi cache token.
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web.OWIN;
using System.Web.Services.Description;
namespace OwinWebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
OwinTokenAcquirerFactory factory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
app.AddMicrosoftIdentityWebApp(factory);
factory.Services
.Configure<ConfidentialClientApplicationOptions>(options => { options.RedirectUri = "https://localhost:44386/"; })
.AddMicrosoftGraph()
.AddDownstreamApi("DownstreamAPI1", factory.Configuration.GetSection("DownstreamAPI"))
.AddInMemoryTokenCaches();
factory.Build();
}
}
}
--
Validasi token
Dalam cuplikan sebelumnya, middleware JwtBearer, seperti middleware OpenID Connect di aplikasi web, memvalidasi token berdasarkan nilai TokenValidationParameters. Token didekripsi sesuai kebutuhan, klaim diekstraksi, dan tanda tangan diverifikasi. Middleware kemudian memvalidasi token dengan memeriksa data ini:
Audiens: Token ditargetkan untuk API web.
Sub: Ini dikeluarkan untuk aplikasi yang diizinkan untuk memanggil API web.
Penerbit: Itu dikeluarkan oleh layanan token keamanan tepercaya (STS).
Kedaluwarsa: Masa pakainya ada dalam rentang.
Tanda tangan: Tanda tangan tidak dirusak.
Mungkin juga ada validasi khusus. Misalnya, dimungkinkan untuk memvalidasi kunci penandatanganan tersebut, saat disematkan dalam token, tepercaya dan bahwa token tidak digunakan ulang. Akhirnya, beberapa protokol memerlukan validasi khusus.
Memastikan token adalah untuk aplikasi yang memvalidasi token untuk Anda.
ValidateIssuer
Memastikan token dikeluarkan oleh STS tepercaya, yang berarti berasal dari seseorang yang Anda percayai.
ValidateIssuerSigningKey
Memastikan aplikasi yang memvalidasi token mempercayai kunci yang digunakan untuk menandatangani token. Ada kasus khusus saat kunci tersemat di dalam token. Tapi kasus ini biasanya tidak muncul.
ValidateLifetime
Memastikan token masih atau sudah valid. Validator memeriksa apakah masa pakai token berada dalam rentang yang ditentukan oleh klaim notbefore (tidak sebelum) dan expires (kedaluwarsa).
ValidateSignature
Memastikan token belum dirusak.
ValidateTokenReplay
Memastikan token tidak digunakan ulang. Ada kasus khusus untuk beberapa protokol sekali pakai.
Mengustomisasi validasi token
Validator dikaitkan dengan properti kelas TokenValidationParameters. Properti diinisialisasi dari konfigurasi ASP.NET dan ASP.NET Core.
Dalam sebagian besar kasus, Anda tidak perlu mengubah parameter. Aplikasi yang bukan penyewa tunggal adalah pengecualian. Aplikasi web ini menerima pengguna dari organisasi atau dari akun Microsoft pribadi. Penerbit dalam hal ini harus divalidasi. Microsoft.Identity.Web juga mengurus validasi penerbit.
Di ASP.NET Core, jika Anda ingin menyesuaikan parameter validasi token, gunakan cuplikan berikut di Startup.cs Anda:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
});
Untuk ASP.NET MVC, contoh kode berikut menunjukkan cara melakukan validasi token kustom:
Anda juga dapat memvalidasi token akses masuk di Azure Functions. Anda dapat menemukan contoh validasi tersebut di dalam sampel kode berikut di GitHub: