Serialisatie van tokencache in MSAL.NET

Nadat MsAL (Microsoft Authentication Library) een token heeft verkregen, wordt dat token in de cache opgeslagen. Openbare clienttoepassingen (desktop- en mobiele apps) moeten proberen een token op te halen uit de cache voordat u een token via een andere methode verkrijgt. Overnamemethoden voor vertrouwelijke clienttoepassingen beheren de cache zelf. In dit artikel worden de standaard- en aangepaste serialisatie van de tokencache in MSAL.NET besproken.

Korte samenvatting

De aanbeveling is:

Het NuGet-pakket Microsoft.Identity.Web.TokenCache biedt serialisatie van tokencaches in de Microsoft.Identity.Web-bibliotheek.

Als u de MSAL-bibliotheek rechtstreeks in een ASP.NET Core-app gebruikt, kunt u overwegen Microsoft.Identity.Web te gebruiken, wat een eenvoudigere API op een hoger niveau biedt. Zie anders Niet-ASP.NET Core web-apps en web-API's, waarin direct MSAL-gebruik wordt behandeld.

Extensiemethode Description
AddInMemoryTokenCaches Hiermee maakt u een tijdelijke cache in het geheugen voor tokenopslag en ophalen. Tokencaches in het geheugen zijn sneller dan andere cachetypen, maar hun tokens blijven niet behouden tussen het opnieuw opstarten van de toepassing en u kunt de cachegrootte niet bepalen. Caches in het geheugen zijn geschikt voor toepassingen waarvoor geen tokens hoeven te worden bewaard tussen het opnieuw opstarten van apps. Gebruik een tokencache in het geheugen in apps die deelnemen aan verificatiescenario's van computer-naar-computer, zoals services, daemons en andere die AcquireTokenForClient gebruiken (de clientreferenties verlenen). Tokencaches in het geheugen zijn ook geschikt voor voorbeeldtoepassingen en tijdens het ontwikkelen van lokale apps. Microsoft.Identity.Web-versies 1.19.0+ delen een tokencache in het geheugen in alle toepassingsexemplaren.
AddSessionTokenCaches De tokencache is gebonden aan de gebruikerssessie. Deze optie is niet ideaal als het id-token veel claims bevat, omdat de cookie te groot wordt.
AddDistributedTokenCaches De tokencache is een adapter voor de ASP.NET Core IDistributedCache implementatie. Hiermee kunt u kiezen tussen een gedistribueerde geheugencache, een Redis-cache, een gedistribueerde NCache of een SQL Server-cache. Zie IDistributedCachegedistribueerde geheugencache voor meer informatie over de implementaties.

Tokencache in het geheugen

Hier volgt een voorbeeld van code die gebruikmaakt van de cache in het geheugen in de methode ConfigureServices van de klasse Startup in een ASP.NET Core-toepassing:

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 is geschikt in productie als u alleen-app-tokens aanvraagt. Als u gebruikerstokens gebruikt, kunt u overwegen een gedistribueerde tokencache te gebruiken.

Configuratiecode voor tokencache is vergelijkbaar tussen ASP.NET Core web-apps en web-API's.

Gedistribueerde tokencaches

Hier volgen voorbeelden van mogelijke gedistribueerde caches:

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

Zie voor meer informatie:

Het gebruik van gedistribueerde cache wordt weergegeven in de zelfstudie ASP.NET Core web-app in de fase 2-2 tokencache.

Verhoudingen van cachetreffers en cacheprestaties bewaken

MSAL maakt belangrijke metrische gegevens beschikbaar als onderdeel van het object AuthenticationResult.AuthenticationResultMetadata. U kunt deze metrische gegevens registreren om de status van uw toepassing te beoordelen.

Metrisch Betekenis Wanneer moet ik een alarm activeren?
DurationTotalInMs Totale tijd die is besteed aan MSAL, inclusief netwerkoproepen en cache. Alarm over totale hoge latentie (> 1 seconde). Waarde is afhankelijk van de tokenbron. Vanuit de cache: één cachetoegang. Vanuit Azure Active Directory (Azure AD): twee maal cachetoegang plus één HTTP-aanroep. De eerste aanroep (per proces) duurt langer vanwege één extra HTTP-aanroep.
DurationInCacheInMs Tijd die is besteed aan het laden of opslaan van de tokencache, die is aangepast door de app-ontwikkelaar (bijvoorbeeld opslaan in Redis). Alarm bij pieken.
DurationInHttpInMs Tijd besteed aan het maken van HTTP-aanroepen naar Azure AD. Alarm bij pieken.
TokenSource Bron van het token. Tokens worden veel sneller opgehaald uit de cache (bijvoorbeeld ~100 ms versus ~700 ms). Kan worden gebruikt om de verhouding van cachetreffers te bewaken en hierover te kunnen alarmeren. Gebruiken met DurationTotalInMs.
CacheRefreshReason Reden voor het ophalen van het toegangstoken van de id-provider. Gebruiken met TokenSource.

Volgende stappen

In de volgende voorbeelden ziet u serialisatie van tokencaches.

Voorbeeld Platform Beschrijving
active-directory-dotnet-desktop-msgraph-v2 Bureaublad (WPF) Windows Desktop .NET-toepassing (WPF) die de Microsoft Graph API aanroept. Diagram dat een topologie toont met een desktop-app-client die naar Azure Active Directory stroomt door interactief een token te verwerven en naar Microsoft Graph.
active-directory-dotnet-v1-to-v2 Bureaublad (console) Set Visual Studio-oplossingen die de migratie van Azure AD v1.0-toepassingen (met ADAL.NET) illustreren naar toepassingen op het Microsoft Identity-platform (met MSAL.NET). Zie met name de tokencachemigratie en de cache van het vertrouwelijke clienttoken.
ms-identity-aspnet-webapp-openidconnect ASP.NET (net472) Voorbeeld van serialisatie van tokencache in een ASP.NET MVC-toepassing (met MSAL.NET).