Serializzazione della cache dei token

Dopo che Libreria di Autenticazione Microsoft (MSAL) acquisisce un token, memorizza nella cache tale token. Le applicazioni client pubbliche (app desktop e per dispositivi mobili) devono provare a ottenere un token dalla cache prima di acquisire un token da un altro metodo. I metodi di acquisizione nelle applicazioni client riservate gestiscono autonomamente la cache. Questo articolo illustra la serializzazione predefinita e personalizzata della cache dei token in MSAL.NET.

Sommario

La raccomandazione è:

  • Quando si scrivono app per dispositivi mobili, la memorizzazione nella cache è già preconfigurato da MSAL.
  • Quando si scrive un'applicazione desktop, usare la cache dei token multipiattaforma come illustrato nelle app desktop.
  • Quando si scrivono nuove applicazioni client riservate (app Web, API Web o app da servizio a servizio o daemon, usare Microsoft. Identity.Web come API di livello superiore. Offre l'integrazione con ASP.NET Core, ASP.NET classico e funziona anche in modalità autonoma.
  • Le applicazioni client riservate esistenti che sfruttano MSAL.NET direttamente possono continuare a farlo.
  • Le app Web e le API Web devono usare una cache dei token distribuita (ad esempio, Redis, SQL Server, Azure Cosmos DB) insieme a una cache di memoria vincolata.
  • La crittografia dei dati archiviati può essere configurata facoltativamente tramite ASP.NET Core Data Protection.
  • Le app Web possono anche basarsi sui cookie di sessione; tuttavia, questa opzione non è consigliata a causa delle dimensioni dei cookie.
  • Le app servizio-servizio e le app daemon possono basarsi esclusivamente sulla cache in memoria. Se l'app serve molti tenant, configura un criterio di espulsione.
  • I token di identità gestiti vengono memorizzati nella cache solo in memoria.

Il pacchetto NuGet Microsoft.Identity.Web.TokenCache fornisce la serializzazione della cache dei token all'interno della libreria Microsoft.Identity.Web. La libreria fornisce l'integrazione con ASP.NET Core e ASP.NET classico e le relative astrazioni possono essere usate per guidare altre app Web o framework API.

Note

Gli esempi seguenti sono per ASP.NET Core. Per ASP.NET il codice è simile, vedere l'esempio ms-identity-aspnet-wepapp-openidconnect di app Web per un'implementazione di riferimento.

Metodo di estensione Description
AddInMemoryTokenCaches Crea una cache temporanea in memoria per l'archiviazione e il recupero dei token. Le cache dei token in memoria sono più veloci rispetto ad altri tipi di cache, ma i relativi token non vengono mantenuti tra i riavvii dell'applicazione e non è possibile controllare le dimensioni della cache. Le cache in memoria sono valide per le applicazioni che non richiedono la persistenza dei token tra i riavvii dell'app. Usare una cache dei token in memoria nelle app che partecipano a scenari di autenticazione da computer a computer, ad esempio servizi, daemon e altri che usano AcquireTokenForClient (concessione delle credenziali client). Le cache dei token in memoria sono valide anche per le applicazioni di esempio e durante lo sviluppo di app locali. Le versioni 1.19.0+ di Microsoft.Identity.Web condividono la stessa cache dei token in memoria tra tutte le istanze dell'applicazione.
AddSessionTokenCaches La cache dei token è associata alla sessione utente. Questa opzione non è ideale se il token ID contiene molte attestazioni, perché il cookie diventa troppo grande.
AddDistributedTokenCaches La cache dei token è un adattatore rispetto all'implementazione ASP.NET CoreIDistributedCache. Consente di scegliere tra una cache di memoria distribuita, una cache Redis, una NCache distribuita o una cache SQL Server. Per informazioni dettagliate sulle IDistributedCache implementazioni, vedere Cache di memoria distribuita.

Cache dei token in memoria

Ecco un esempio di codice che usa la cache in memoria nel metodo ConfigureServices della classe Startup in un'applicazione 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 è adatto nell'ambiente di produzione se si richiedono token solo app. Se si usano token utente, è consigliabile usare una cache dei token distribuiti.

Il codice di configurazione della cache dei token è simile tra ASP.NET Core app Web e API Web.

Cache dei token distribuiti

Ecco alcuni esempi di possibili cache distribuite:

// 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;
});

Per ulteriori informazioni consulta:

L'uso della cache distribuita viene illustrato nel tutorial dell'app web ASP.NET Core nella fase 2-2 della cache dei token.

Monitorare i rapporti di riscontri della cache e le prestazioni della cache

MSAL espone metriche importanti come parte dell'oggetto AuthenticationResult.AuthenticationResultMetadata . È possibile registrare queste metriche per valutare l'integrità dell'applicazione.

Metrica Meaning Quando attivare un allarme?
DurationTotalInMs Tempo totale impiegato in MSAL, incluse le chiamate di rete e la cache. Allarme sulla latenza complessiva elevata (> 1 secondo). Il valore dipende dall'origine del token. Dalla cache: un accesso alla cache. Da Microsoft Entra ID: due accessi alla cache più una chiamata HTTP. La prima chiamata (per processo) richiede più tempo a causa di una chiamata HTTP aggiuntiva.
DurationInCacheInMs Tempo impiegato per il caricamento o il salvataggio della cache dei token, che viene personalizzato dallo sviluppatore dell'app (ad esempio, salvare in Redis). Allarme per i picchi.
DurationInHttpInMs Tempo impiegato per effettuare chiamate HTTP a Microsoft Entra ID. Allarme per i picchi.
TokenSource Origine del token. I token vengono recuperati dalla cache molto più velocemente ,ad esempio ~100 ms rispetto a ~700 ms. Può essere usato per monitorare e generare avvisi sul rapporto di hit della cache. Usare con DurationTotalInMs.
CacheRefreshReason Motivo del recupero del token di accesso dal fornitore di identità. Usare con TokenSource.

Approssimazioni delle dimensioni

Quando si usa una cache dei token, è importante considerare le potenziali dimensioni della cache, soprattutto per le applicazioni a disponibilità elevata e distribuite. Quando gli utenti accedono, verrà creata una voce di cache per ciascun utente, di dimensione pari a circa 7 KB. Le dimensioni saranno maggiori se si chiamano diverse API downstream. Per l'autenticazione tra servizi, ci sarà una voce nella cache per ogni tenant e API downstream, di circa 2 KB.

Le stime dettagliate sono elencate di seguito.

Flussi dell'applicazione (AcquireTokenForClient, AcquireTokenForManagedIdentity)

  • Vengono memorizzati nella cache solo i token di accesso. Un token di circa 2-3 KB quando è persistente. Saranno presenti 1 token per ID client dell'app * tenant * risorse downstream. Ad esempio, un'app multi-tenant che gestisce 1000 tenant e richiede token per Graph e SharePoint userà: 3 KB * 1000 * 2, ad esempio circa 6 MB.

sito Web che chiama un'API Web downstream (AcquireTokenByAuthCode)

  • Token di accesso : 4 KB; 1 token per ID client dell'app * utente * tenant * risorsa downstream.
  • Token di aggiornamento : 2 KB; 1 token per ID app client * utente.
  • Token ID : 2 KB; 1 token per ID app client * utente * numero di tenant in cui l'utente accede.

Note

Consigliamo vivamente di usare per questo le API di livello superiore di Microsoft.Identity.Web e non MSAL direttamente. Le considerazioni sulla memorizzazione nella cache sono le stesse.

API Web che chiama altre API Web (AcquireTokenOnBehalfOf)

Come per lo scenario del sito Web, ma sarà presente un nodo per ogni sessione, non per ogni utente. Per impostazione predefinita, MSAL identifica una sessione eseguendo l'hashing dell'asserzione upstream, ma può essere modificata. Vedere Processi OBO a esecuzione prolungata.

Note

Consigliamo vivamente di usare per questo le API di livello superiore di Microsoft.Identity.Web e non direttamente MSAL. Le considerazioni sulla memorizzazione nella cache sono le stesse.

Tipi di cache dei token

MSAL.NET funziona con due tipi di cache di token: utente e applicazione.

Cache dei token dell'applicazione che contiene i token di accesso per questa applicazione. Viene gestito e aggiornato automaticamente quando si chiama AcquireTokenForClient.

La cache dei token utente contiene token ID, token di accesso e token di aggiornamento per gli account con cui interagisce MSAL.NET. Viene usato e aggiornato automaticamente se necessario quando si chiama AcquireTokenSilent. Viene aggiornato da ogni metodo di acquisizione di token, ad eccezione di AcquireTokenForClient che usa solo la cache dell'applicazione.

Passaggi successivi

Gli esempi seguenti illustrano la serializzazione della cache dei token.

Sample Platform Description
active-directory-dotnet-desktop-msgraph-v2 Desktop (macchine virtuali Windows) un'applicazione desktop Windows .NET (macchine virtuali Windows) che chiama l'API Microsoft Graph. Diagramma che mostra una topologia con un client di app desktop che passa a Microsoft Entra ID acquisendo un token in modo interattivo e per Microsoft Graph.
active-directory-dotnet-v1-to-v2 Desktop (console) Set di soluzioni Visual Studio che illustrano la migrazione di applicazioni ad AD v1.0 Azure (tramite ADAL.NET) alle applicazioni Microsoft Identity Platform (usando MSAL.NET).
ms-identity-aspnet-webapp-openidconnect ASP.NET (net472) Esempio di serializzazione della cache dei token in un'applicazione ASP.NET MVC (usando MSAL.NET).