Serialisasi cache token

Setelah Pustaka Autentikasi Microsoft (MSAL) memperoleh token, pustaka tersebut menyimpan token itu di cache. Aplikasi klien publik (aplikasi desktop dan seluler) harus mencoba mendapatkan token dari cache sebelum memperoleh token dengan metode lain. Metode akuisisi pada aplikasi klien rahasia mengelola cache itu sendiri. Artikel ini membahas serialisasi default dan kustom cache token di MSAL.NET.

RINGKASAN

Rekomendasinya adalah:

  • Saat mengembangkan aplikasi seluler, cache sudah dikonfigurasi sebelumnya di MSAL.
  • Saat menulis aplikasi desktop, gunakan cache token lintas platform seperti yang dijelaskan di aplikasi desktop.
  • Saat menulis aplikasi klien rahasia baru (aplikasi web, API web, atau aplikasi layanan ke layanan atau daemon, gunakan Microsoft. Identity.Web sebagai API tingkat yang lebih tinggi. Ini menawarkan integrasi dengan ASP.NET Core, ASP.NET Classic, dan berfungsi mandiri juga.
  • Aplikasi klien rahasia yang ada yang memanfaatkan MSAL.NET secara langsung dapat terus melakukannya.
  • Aplikasi web dan API web harus menggunakan cache token terdistribusi (misalnya, Redis, SQL Server, Azure Cosmos DB) bersama dengan cache memori yang dibatasi.
  • Enkripsi saat tidak aktif dapat dikonfigurasi secara opsional menggunakan ASP.NET Core Perlindungan Data.
  • Aplikasi web juga dapat mengandalkan cookie sesi; namun, opsi ini tidak disarankan karena ukuran cookie.
  • Aplikasi layanan-ke-layanan dan daemon dapat hanya mengandalkan cache memori. Jika aplikasi Anda melayani banyak penyewa, konfigurasikan kebijakan pengeluaran.
  • Token identitas terkelola hanya di-cache dalam memori.

Paket NuGet Microsoft.Identity.Web.TokenCache menyediakan serialisasi cache token di dalam pustaka Microsoft.Identity.Web. Pustaka menyediakan integrasi dengan ASP.NET Core dan ASP.NET Classic, dan abstraksinya dapat digunakan untuk mendorong aplikasi web atau kerangka kerja API lainnya.

Note

Contoh di bawah ini adalah untuk ASP.NET Core. Untuk ASP.NET kode serupa, lihat ms-identity-aspnet-wepapp-openidconnect sampel aplikasi web untuk implementasi referensi.

Metode ekstensi Deskripsi
AddInMemoryTokenCaches Membuat cache sementara dalam memori untuk penyimpanan dan pengambilan token. Cache token dalam memori lebih cepat daripada jenis cache lainnya, tetapi tokennya tidak disimpan saat aplikasi dimulai ulang, dan Anda tidak dapat mengontrol ukuran cache. Cache di memori cocok untuk aplikasi yang tidak mengharuskan token tetap dipertahankan setelah aplikasi dimulai ulang. Gunakan cache token dalam memori di aplikasi yang berpartisipasi dalam skenario autentikasi mesin-ke-mesin seperti layanan, daemon, dan lainnya yang menggunakan AcquireTokenForClient (pemberian kredensial klien). Cache token dalam memori juga baik untuk aplikasi sampel dan selama pengembangan aplikasi lokal. Microsoft. Identity.Web versi 1.19.0+ berbagi cache token dalam memori di semua instans aplikasi.
AddSessionTokenCaches Cache token terikat ke sesi pengguna. Opsi ini tidak ideal jika token ID berisi banyak klaim, karena cookie menjadi terlalu besar.
AddDistributedTokenCaches Cache token adalah adaptor terhadap implementasi ASP.NET CoreIDistributedCache. Ini memungkinkan Anda memilih antara cache memori terdistribusi, cache Redis, NCache terdistribusi, atau cache SQL Server. Untuk detail tentang IDistributedCache implementasi, lihat Cache memori terdistribusi.

Cache token dalam memori

Berikut adalah contoh kode yang menggunakan cache dalam memori dalam metode ConfigureServices dari kelas Startup dalam aplikasi ASP.NET Core:

using Microsoft.Identity.Web;

public class Startup
{
 const string scopesToRequest = "user.read";
  
  public void ConfigureServices(IServiceCollection services)
  {
   // code before
   services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
           .AddMicrosoftIdentityWebApp(Configuration)
             .EnableTokenAcquisitionToCallDownstreamApi(new string[] { scopesToRequest })
                .AddInMemoryTokenCaches();
   // code after
  }
  // code after
}

AddInMemoryTokenCaches cocok untuk lingkungan produksi jika Anda meminta token khusus aplikasi. Jika Anda menggunakan token pengguna, pertimbangkan untuk menggunakan cache token terdistribusi.

Kode konfigurasi cache token mirip antara aplikasi web ASP.NET Core dan API web.

Cache token terdistribusi

Berikut adalah contoh kemungkinan cache terdistribusi:

// or use a distributed Token Cache by adding
   services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
           .AddMicrosoftIdentityWebApp(Configuration)
             .EnableTokenAcquisitionToCallDownstreamApi(new string[] { scopesToRequest }
               .AddDistributedTokenCaches();

// Distributed token caches have a L1/L2 mechanism.
// L1 is in memory, and L2 is the distributed cache
// implementation that you will choose below.
// You can configure them to limit the memory of the 
// L1 cache, encrypt, and set eviction policies.
services.Configure<MsalDistributedTokenCacheAdapterOptions>(options => 
  {
    // Optional: Disable the L1 cache in apps that don't use session affinity
    //                 by setting DisableL1Cache to 'true'.
    options.DisableL1Cache = false;
    
    // Or limit the memory (by default, this is 500 MB)
    options.L1CacheOptions.SizeLimit = 1024 * 1024 * 1024; // 1 GB

    // You can choose if you encrypt or not encrypt the cache
    options.Encrypt = false;

    // And you can set eviction policies for the distributed
    // cache.
    options.SlidingExpiration = TimeSpan.FromHours(1);
  });

// Then, choose your implementation of distributed cache
// -----------------------------------------------------

// good for prototyping and testing, but this is NOT persisted and it is NOT distributed - do not use in production
services.AddDistributedMemoryCache();

// Or a Redis cache
// Requires the Microsoft.Extensions.Caching.StackExchangeRedis NuGet package
services.AddStackExchangeRedisCache(options =>
{
 options.Configuration = "localhost";
 options.InstanceName = "SampleInstance";
});

// You can even decide if you want to repair the connection
// with Redis and retry on Redis failures. 
services.Configure<MsalDistributedTokenCacheAdapterOptions>(options => 
{
  options.OnL2CacheFailure = (ex) =>
  {
    if (ex is StackExchange.Redis.RedisConnectionException)
    {
      // action: try to reconnect or something
      return true; //try to do the cache operation again
    }
    return false;
  };
});

// Or even a SQL Server token cache
// Requires the Microsoft.Extensions.Caching.SqlServer NuGet package
services.AddDistributedSqlServerCache(options =>
{
 options.ConnectionString = _config["DistCache_ConnectionString"];
 options.SchemaName = "dbo";
 options.TableName = "TestCache";
});

// Or an Azure Cosmos DB cache
// Requires the Microsoft.Extensions.Caching.Cosmos NuGet package
services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.ContainerName = Configuration["CosmosCacheContainer"];
    cacheOptions.DatabaseName = Configuration["CosmosCacheDatabase"];
    cacheOptions.ClientBuilder = new CosmosClientBuilder(Configuration["CosmosConnectionString"]);
    cacheOptions.CreateIfNotExists = true;
});

Untuk informasi selengkapnya, lihat:

Penggunaan cache terdistribusi ditampilkan dalam tutorial aplikasi web ASP.NET Core dalam cache token fase 2-2.

Memantau rasio hit cache dan performa cache

MSAL mengekspos metrik penting sebagai bagian dari objek AuthenticationResult.AuthenticationResultMetadata . Anda dapat mencatat metrik ini untuk menilai kesehatan aplikasi Anda.

Ukuran Meaning Kapan harus memicu alarm?
DurationTotalInMs Total waktu yang dihabiskan di MSAL, termasuk panggilan jaringan dan cache. Alarm pada latensi tinggi keseluruhan (> 1 detik). Nilai tergantung pada sumber token. Dari cache: satu akses cache. Dari Microsoft Entra ID: dua akses cache ditambah satu panggilan HTTP. Panggilan pertama (per proses) membutuhkan waktu lebih lama karena satu panggilan HTTP tambahan.
DurationInCacheInMs Waktu yang dihabiskan untuk memuat atau menyimpan cache token, yang disesuaikan oleh pengembang aplikasi (misalnya, simpan ke Redis). Alarm saat terjadi lonjakan.
DurationInHttpInMs Waktu yang dihabiskan untuk melakukan panggilan HTTP ke Microsoft Entra ID. Alarm saat terjadi lonjakan.
TokenSource Sumber token. Token diambil dari cache jauh lebih cepat (misalnya, ~100 ms versus ~700 ms). Dapat digunakan untuk memantau dan memberikan alarm pada rasio hit cache. Gunakan dengan DurationTotalInMs.
CacheRefreshReason Alasan untuk mengambil token akses dari penyedia identitas. Gunakan dengan TokenSource.

Perkiraan ukuran

Saat menggunakan cache token, penting untuk mempertimbangkan ukuran potensial cache, terutama untuk aplikasi yang sangat tersedia dan terdistribusi. Saat pengguna masuk, akan ada entri cache untuk setiap pengguna, berukuran sekitar 7KB. Ukurannya akan lebih besar jika Anda memanggil beberapa API hilir. Untuk autentikasi layanan ke layanan, akan ada entri cache untuk setiap penyewa dan API hilir, berukuran sekitar 2KB.

Perkiraan terperinci tercantum di bawah ini.

Alur aplikasi (AcquireTokenForClient, AcquireTokenForManagedIdentity)

  • Hanya token akses yang di-cache. Satu token berukuran sekitar 2–3 KB saat disimpan. Akan ada 1 token per ID klien aplikasi * penyewa * sumber daya hilir. Misalnya, aplikasi multipenyewa yang melayani 1000 penyewa dan memerlukan token untuk Graph dan SharePoint akan menggunakan: 3 KB * 1000 * 2, yakni sekitar 6 MB.

Situs web memanggil API web hilir (AcquireTokenByAuthCode)

  • Token akses – 4KB; 1 token per ID klien aplikasi * pengguna * penyewa * sumber daya hilir.
  • Refresh token – 2KB; 1 token per ID aplikasi klien * pengguna.
  • Token ID – 2KB; 1 token per ID aplikasi klien * pengguna * jumlah penyewa tempat pengguna tersebut masuk.

Note

Kami sangat menyarankan untuk menggunakan API tingkat yang lebih tinggi dari Microsoft.Identity.Web untuk ini dan bukan MSAL secara langsung. Pertimbangan cache tetap sama.

API Web memanggil API web lainnya (AcquireTokenOnBehalfOf)

Sama seperti untuk skenario situs web, tetapi akan ada 1 simpul untuk setiap sesi, bukan untuk setiap pengguna. Secara bawaan, MSAL mengidentifikasi sesi dengan membuat hash dari pernyataan upstream, tetapi hal ini dapat diubah. Lihat Proses OBO yang Berjalan Lama.

Note

Kami sangat menyarankan untuk menggunakan API tingkat yang lebih tinggi dari Microsoft.Identity.Web untuk ini dan bukan MSAL secara langsung. Pertimbangan terkait cache tetap sama.

Jenis cache token

MSAL.NET beroperasi dengan dua jenis cache token - pengguna dan aplikasi.

Cache token aplikasi yang menyimpan token akses untuk aplikasi ini. Ini dipertahankan dan diperbarui secara diam-diam saat memanggil AcquireTokenForClient.

Cache token pengguna menyimpan token ID, token akses, dan token refresh untuk akun yang berinteraksi dengan MSAL.NET. Ini digunakan dan diperbarui secara diam-diam jika diperlukan saat memanggil AcquireTokenSilent. Ini diperbarui oleh setiap metode akuisisi token, dengan pengecualian AcquireTokenForClient yang hanya menggunakan cache aplikasi.

Langkah berikutnya

Sampel berikut mengilustrasikan serialisasi cache token.

Sample Platform Deskripsi
active-directory-dotnet-desktop-msgraph-v2 Desktop (WPF) aplikasi Windows Desktop .NET (WPF) yang memanggil Microsoft Graph API. Diagram yang menunjukkan topologi dengan alur dari klien aplikasi desktop ke Microsoft Entra ID dengan memperoleh token secara interaktif, dan ke Microsoft Graph.
active-directory-dotnet-v1-to-v2 Desktop (konsol) Kumpulan solusi Visual Studio yang menggambarkan migrasi aplikasi Azure AD v1.0 (menggunakan ADAL.NET) ke aplikasi platform identitas Microsoft (menggunakan MSAL.NET).
ms-identity-aspnet-webapp-openidconnect ASP.NET (net472) Contoh serialisasi cache token dalam aplikasi ASP.NET MVC (menggunakan MSAL.NET).