Bagikan melalui


Membangun layanan yang tahan terhadap refresh metadata Microsoft Entra ID OpenID Koneksi

API web yang dilindungi harus memvalidasi token akses. Aplikasi web juga memvalidasi token ID. Validasi Token memiliki beberapa bagian, yang memeriksa apakah token milik aplikasi, sudah dikeluarkan oleh Penyedia Identitas Tepercaya (IDP), memiliki masa pakai yang masih dalam jangkauan, dan belum diubah. Mungkin juga ada validasi khusus. Misalnya, aplikasi harus memvalidasi tanda tangan dan kunci penandatanganan (saat disematkan dalam token) tepercaya serta token tidak diputar ulang. Saat kunci penandatanganan tidak disematkan di token, kunci tersebut harus diambil dari penyedia identitas (Penemuan atau Metadata). Terkadang juga perlu untuk mendapatkan kunci secara dinamis saat runtime.

Aplikasi web dan API web harus merefresh metadata OpenID Connect yang kedaluwarsa agar tangguh. Artikel ini memberikan panduan tentang cara mencapai aplikasi yang tangguh. Ini berlaku untuk ASP.NET Core, ASP.NET, dan Microsoft.IdentityModel.

Inti ASP.NET

Gunakan versi terbaru Microsoft.IdentityModel.* dan ikuti panduan di bawah ini secara manual.

Dalam metode ConfigureServices Startup.cs, pastikan JwtBearerOptions.RefreshOnIssuerKeyNotFound diatur ke benar, dan Anda menggunakan pustaka Microsoft.IdentityModel.* terbaru. Properti ini harus difungsikan secara default.

services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
    …
    // shouldn’t be necessary as it’s true by default
    options.RefreshOnIssuerKeyNotFound = true;
    …
});

ASP.NET/ OWIN

Microsoft menyarankan agar Anda beralih ke ASP.NET Core, karena pengembangan telah berhenti di ASP.NET.

Jika Anda menggunakan ASP.NET (Klasik), gunakan Microsoft.IdentityModel terbaru .*.

OWIN memiliki interval refresh 24 jam otomatis untuk OpenIdConnectConfiguration. Refresh ini hanya akan dipicu jika permintaan diterima setelah rentang waktu 24 jam berlalu. Sejauh yang kami tahu, tidak ada cara untuk mengubah nilai ini atau memicu refresh lebih awal, selain memulai ulang aplikasi.

Microsoft.IdentityModel

Jika memvalidasi sendiri token Anda, misalnya dalam Azure Functios, gunakan versi Microsoft.IdentityModel.* terbaru dan ikuti panduan metadata yang diilustrasikan oleh cuplikan kode di bawah ini.

var configManager =
  new ConfigurationManager<OpenIdConnectConfiguration>(
    "http://someaddress.com",
    new OpenIdConnectConfigurationRetriever());

var config = await configManager.GetConfigurationAsync().ConfigureAwait(false);
var validationParameters = new TokenValidationParameters()
{
  …
  IssuerSigningKeys = config.SigningKeys;
  …
}

var tokenHandler = new JsonWebTokenHandler();
result = Handler.ValidateToken(jwtToken, validationParameters);
if (result.Exception != null && result.Exception is SecurityTokenSignatureKeyNotFoundException)
{
  configManager.RequestRefresh();
  config = await configManager.GetConfigurationAsync().ConfigureAwait(false);
  validationParameters = new TokenValidationParameters()
  {
    …
    IssuerSigningKeys = config.SigningKeys,
    …
  };

  // attempt to validate token again after refresh
  result = Handler.ValidateToken(jwtToken, validationParameters);
}

Langkah berikutnya

Untuk mempelajari lebih lanjut, lihat validasi token di API web yang dilindungi