Serialisering av tokencachen

När Microsofts autentiseringsbibliotek (MSAL) har hämtat en token lagrar det den i cacheminnet. Offentliga klientprogram (skrivbords- och mobilappar) bör försöka hämta en token från cacheminnet innan en token hämtas med en annan metod. Anskaffningsmetoder för konfidentiella klientprogram hanterar själva cachen. I den här artikeln beskrivs standard- och anpassad serialisering av tokencachen i MSAL.NET.

Sammanfattning

Rekommendationen är:

  • När du skriver mobilappar är cachelagring redan förkonfigurerad av MSAL.
  • När du skriver ett skrivbordsprogram använder du plattformsoberoende tokencache enligt beskrivningen i skrivbordsappar.
  • När du skriver nya konfidentiella klientprogram (webbappar, webb-API:er eller tjänst-till-tjänst- eller daemon-appar använder du Microsoft. Identity.Web som ett API på högre nivå. Det erbjuder integrering med ASP.NET Core, ASP.NET Classic och fungerar även fristående.
  • Befintliga konfidentiella klientprogram som utnyttjar MSAL.NET direkt kan fortsätta att göra det.
  • Webbappar och webb-API:er bör använda en distribuerad tokencache (t.ex. Redis, SQL Server, Azure Cosmos DB) tillsammans med en begränsad minnescache.
  • Kryptering i vila kan valfritt konfigureras med ASP.NET Core Data Protection.
  • Webbappar kan också förlita sig på sessionscookies. Det här alternativet rekommenderas dock inte på grund av cookiestorleken.
  • Tjänst-till-tjänst- och daemon-appar kan endast förlita sig på minnescachelagring. Om din app betjänar många klienter konfigurerar du en borttagningsprincip.
  • Hanterade identitetstoken cachelagras endast i minnet.

NuGet-paketet Microsoft.Identity.Web.TokenCache tillhandahåller serialisering av tokencache i biblioteket Microsoft.Identity.Web. Biblioteket innehåller integrering med både ASP.NET Core och ASP.NET Classic, och dess abstraktioner kan användas för att driva andra webbappar eller API-ramverk.

Note

Exemplen nedan är för ASP.NET Core. För ASP.NET koden är liknande, se webbappexemplet ms-identity-aspnet-wepapp-openidconnect för en referensimplementering.

Tilläggsmetod Description
AddInMemoryTokenCaches Skapar en tillfällig cache i minnet för tokenlagring och hämtning. Minnesinterna tokencacheminnen är snabbare än andra cachetyper, men deras token sparas inte mellan programomstarter och du kan inte styra cachestorleken. Minnesbaserade cacheminnen är bra för appar som inte kräver att token sparas mellan omstarter av appen. Använd en minnesintern tokencache i appar som deltar i dator-till-dator-autentiseringsscenarier som tjänster, daemoner och andra som använder AcquireTokenForClient (klientautentiseringsuppgifterna beviljar). Token-cacheminnen i arbetsminnet är också bra för exempelappar och vid lokal apputveckling. Microsoft.Identity.Web-versionerna 1.19.0+ delar en minnesintern tokencache mellan alla programinstanser.
AddSessionTokenCaches Tokencachen är bunden till användarsessionen. Det här alternativet är inte idealiskt om ID-token innehåller många anspråk eftersom cookien blir för stor.
AddDistributedTokenCaches Tokencachen är en adapter för ASP.NET Core IDistributedCache-implementeringen. Det gör att du kan välja mellan en distribuerad minnescache, en Redis-cache, en distribuerad NCache eller en SQL Server cache. Mer information om implementeringarna finns i IDistributedCacheDistribuerad minnescache.

Internminnesbaserad cache för token

Här är ett exempel på kod som använder minnesintern cache i metoden ConfigureServices i startklassen i ett ASP.NET Core program:

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 kan användas i produktion om du endast begär apptokenar. Om du använder användartoken bör du överväga att använda en distribuerad tokencache.

Konfigurationskoden för token-cachen är likartad i ASP.NET Core-webbappar och webb-API:er.

Cacheminnen för distribuerad token

Här är exempel på möjliga distribuerade cacheminnen:

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

Mer information finns i:

Användningen av distribuerad cache finns i självstudiekursen för ASP.NET Core webbapp i tokencache för fas 2-2.

Övervaka cacheträffar och cacheprestanda

MSAL exponerar viktiga mått som en del av AuthenticationResult.AuthenticationResultMetadata-objektet . Du kan logga dessa mått för att utvärdera hälsotillståndet för ditt program.

Metric Meaning När utlöser du ett larm?
DurationTotalInMs Total tid i MSAL, inklusive nätverksanrop och cacheminne. Larm om övergripande långa svarstider (> 1 sekund). Värdet beror på tokenkällan. Från cachen: en cacheåtkomst. Från Microsoft Entra ID: två cacheåtkomster plus ett HTTP-anrop. Första samtalet (per process) tar längre tid på grund av ett extra HTTP-anrop.
DurationInCacheInMs Tid som läggs på att läsa in eller spara tokencachen, som apputvecklaren har anpassat (till exempel att spara i Redis). Larm vid toppar.
DurationInHttpInMs Tid som ägnas åt att göra HTTP-anrop till Microsoft Entra ID. Larm vid toppar.
TokenSource Tokens källa. Token hämtas från cachen mycket snabbare (till exempel ~100 ms jämfört med ~700 ms). Kan användas för att övervaka och larma cacheträffförhållandet. Använd med DurationTotalInMs.
CacheRefreshReason Orsak till att hämta åtkomsttoken från identitetsprovidern. Använd med TokenSource.

Storleksimimeringar

När du använder en tokencache är det viktigt att tänka på cachens potentiella storlek, särskilt för program med hög tillgänglighet och distribuerade program. När användarna loggar in kommer det att finnas en cachepost för varje användare, cirka 7 KB i storlek. Storleken blir större om du anropar flera underordnade API:er. För tjänst-till-tjänst-autentisering kommer det att finnas en cachepost för varje klientorganisation och underordnat API, på cirka 2 kB.

Detaljerade uppskattningar visas nedan.

Programflöden (AcquireTokenForClient, AcquireTokenForManagedIdentity)

  • Endast åtkomsttoken cachelagras. En token på cirka 2–3 kB vid lagring. Det kommer att finnas 1 token per appklient-ID * klientorganisationer * underordnade resurser. En app med flera klientorganisationer som betjänar 1 000 klienter och som behöver token för Graph och SharePoint använder till exempel: 3 KB * 1 000 * 2 d.v.s. cirka 6 MB.

Webbplats som anropar underordnat webb-API (AcquireTokenByAuthCode)

  • Åtkomsttoken – 4 KB; 1 token per appklient-ID * användare * klient * underordnad resurs.
  • Uppdateringstoken – 2 KB; 1 token per klientapps-ID * användare.
  • ID-token – 2 KB; 1 token per klientapp-ID * användare * antal klienter där användaren loggar in.

Note

Vi rekommenderar starkt att du använder API:er på högre nivå från Microsoft.Identity.Web för detta och inte MSAL direkt. Övervägandena för cachelagring är desamma.

Webb-API som anropar annat webb-API (AcquireTokenOnBehalfOf)

Samma som för webbplatsscenario, men det kommer att finnas 1 nod för varje session, inte för varje användare. Som standard identifierar MSAL en session genom att hashkoda uppströmsassertionen, men detta kan ändras. Se Långvariga OBO-processer.

Note

Vi rekommenderar starkt att du använder API:er på högre nivå från Microsoft.Identity.Web för detta och inte MSAL direkt. Övervägandena för cachelagring är desamma.

Typer av tokencache

MSAL.NET fungerar med två typer av tokencacheminnen – användare och program.

Cacheminnet för programtoken som innehåller åtkomsttoken för det här programmet. Den underhålls och uppdateras tyst när du anropar AcquireTokenForClient.

Cacheminnet för användartoken innehåller ID-token, åtkomsttoken och uppdateringstoken för konton MSAL.NET interagerar med. Den används och uppdateras tyst om det behövs när du anropar AcquireTokenSilent. Den uppdateras av varje tokenanskaffningsmetod, med undantag för AcquireTokenForClient som endast använder programcachen.

Nästa steg

Följande exempel illustrerar tokencachens serialisering.

Sample Platform Description
active-directory-dotnet-desktop-msgraph-v2 Desktop (WPF) Windows Desktop .NET-program (WPF) som anropar Microsoft Graph API. Diagram som visar en topologi med en skrivbordsapp som ansluter till Microsoft Entra ID genom att interaktivt hämta en token och till Microsoft Graph.
active-directory-dotnet-v1-to-v2 Skrivbord (konsolen) En uppsättning Visual Studio-lösningar som illustrerar migreringen av Azure AD v1.0-applikationer (med ADAL.NET) till applikationer för Microsofts identitetsplattform (med MSAL.NET).
ms-identity-aspnet-webapp-openidconnect ASP.NET (net472) Exempel på tokencache-serialisering i ett ASP.NET MVC-program (med MSAL.NET).