Serialisatie van tokencache

Nadat Microsoft Authentication Library (MSAL) 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 een token wordt verkregen met een andere methode. Overnamemethoden voor vertrouwelijke clienttoepassingen beheren de cache zelf. In dit artikel worden de standaard- en aangepaste serialisatie van de tokencache in MSAL.NET besproken.

Overzicht

De aanbeveling is:

  • Bij het schrijven van mobiele apps is caching al vooraf geconfigureerd door MSAL.
  • Wanneer u een bureaubladtoepassing schrijft, gebruikt u de platformoverschrijdende tokencache, zoals wordt uitgelegd in desktop-apps.
  • Wanneer u nieuwe vertrouwelijke clienttoepassingen (web-apps, web-API's of service-naar-service- of daemon-apps schrijft, gebruikt u Microsoft. Identity.Web als een API op een hoger niveau. Het biedt integratie met ASP.NET Core, ASP.NET Classic en werkt ook zelfstandig.
  • Bestaande vertrouwelijke clienttoepassingen die rechtstreeks gebruikmaken van MSAL.NET kunnen dit blijven doen.
  • Web-apps en web-API's moeten gebruikmaken van een gedistribueerde tokencache (bijvoorbeeld Redis, SQL Server, Azure Cosmos DB) in combinatie met een beperkte geheugencache.
  • Versleuteling van opgeslagen gegevens kan optioneel worden geconfigureerd met behulp van ASP.NET Core Data Protection.
  • Web-apps kunnen ook afhankelijk zijn van sessiecookies; Deze optie wordt echter niet aanbevolen vanwege de cookiegrootte.
  • Service-naar-service- en daemon-apps kunnen alleen afhankelijk zijn van geheugencache. Als uw app veel tenants bedient, configureert u een verwijderingsbeleid.
  • Beheerde identiteitstokens worden alleen in het geheugen opgeslagen.

De Microsoft. Identity.Web.TokenCache NuGet-pakket biedt serialisatie van tokenscache in de Microsoft. Identity.Web library. De bibliotheek biedt integratie met zowel ASP.NET Core als ASP.NET Classic, en de bijbehorende abstracties kunnen worden gebruikt om andere web-app- of API-frameworks te stimuleren.

Note

De onderstaande voorbeelden zijn voor ASP.NET Core. Voor ASP.NET is de code vergelijkbaar; zie het ms-identity-aspnet-wepapp-openidconnect web-appvoorbeeld als referentie-implementatie.

Extensiemethode Description
AddInMemoryTokenCaches Hiermee maakt u een tijdelijke cache in het geheugen voor tokenopslag en ophalen. In-memory tokencaches zijn sneller dan andere cachetypen, maar hun tokens blijven niet behouden tussen het opnieuw opstarten van de toepassing en u kunt de cachegrootte niet beheren. Caches in het geheugen zijn geschikt voor toepassingen waarvoor geen tokens nodig zijn om te worden bewaard tussen het opnieuw opstarten van de app. Gebruik een in-memory tokencache in apps die deelnemen aan machine-naar-machine-verificatiescenario's zoals services, daemons en anderen die AcquireTokenForClient gebruiken (de clientreferenties verlenen). In-memory tokencaches zijn ook geschikt voor voorbeeldtoepassingen en tijdens het ontwikkelen van lokale apps. Microsoft. Identity.Web-versies 1.19.0+ delen een in-memory tokencache voor 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 IDistributedCache 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 voor productie als u tokens aanvraagt die alleen voor apps zijn bedoeld. Als u gebruikerstokens gebruikt, kunt u overwegen om 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;
});

Voor meer informatie, zie:

Het gebruik van de gedistribueerde cache komt aan bod in de ASP.NET Core-web-appzelfstudie in de token-cache van fase 2-2.

Cachetrefferverhoudingen 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.

Metriek Meaning Wanneer een alarm activeren?
DurationTotalInMs Totale tijd die is besteed aan MSAL, inclusief netwerkgesprekken en cache. Waarschuwing bij algemeen hoge latentie (> 1 seconde). De waarde is afhankelijk van de tokenbron. Vanuit de cache: één cachetoegang. Vanuit Microsoft Entra ID: twee cachetoegangen plus één HTTP-aanroep. 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 Microsoft Entra ID. 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 cachetrefferverhouding te bewaken en te alarmeren. Te gebruiken met DurationTotalInMs.
CacheRefreshReason Reden voor het ophalen van het toegangstoken van de id-provider. Te gebruiken met TokenSource.

Schattingen van grootte

Wanneer u een tokencache gebruikt, is het belangrijk om rekening te houden met de mogelijke grootte van de cache, met name voor maximaal beschikbare en gedistribueerde toepassingen. Wanneer gebruikers zich aanmelden, is er een cachevermelding voor elke gebruiker, ongeveer 7 kB groot. De grootte is groter als u verschillende downstream-API's aanroept. Voor service-naar-service-authenticatie is er voor elke tenant en downstream-API een cache-item van ongeveer 2 KB.

Hieronder vindt u gedetailleerde schattingen.

Toepassingsstromen (AcquireTokenForClient, AcquireTokenForManagedIdentity)

  • Alleen toegangstokens worden in de cache opgeslagen. Eén token ongeveer 2-3 kB wanneer deze behouden blijft. Er zal 1 token zijn per app-client-id * tenants * achterliggende resources. Een app met meerdere tenants die 1000 tenants bedient en tokens nodig heeft voor Graph en SharePoint gebruikt bijvoorbeeld: 3 KB * 1000 * 2, bijvoorbeeld ongeveer 6 MB.

Website die downstream-web-API aanroept (AcquireTokenByAuthCode)

  • Toegangstokens – 4 kB; 1 token per app-client-id * gebruiker * tenant * downstreamresource.
  • Token vernieuwen – 2 kB; 1 token per client-app-id * gebruiker.
  • Id-token – 2 kB; 1 token per client-app-id * gebruiker * aantal tenants waarin die gebruiker zich aanmeldt.

Note

We raden u ten zeerste aan om hiervoor de API's op een hoger niveau van Microsoft.Identity.Web te gebruiken en niet rechtstreeks MSAL. De overwegingen voor caching zijn hetzelfde.

Web-API die andere web-API aanroept (AcquireTokenOnBehalfOf)

Hetzelfde als voor een websitescenario, maar er is één knooppunt voor elke sessie, niet voor elke gebruiker. MSAL identificeert standaard een sessie door de upstream-assertie te hashen, maar dit kan worden gewijzigd. Zie langdurige OBO-processen.

Note

We raden u ten zeerste aan om hiervoor de API's op een hoger niveau van Microsoft.Identity.Web te gebruiken en niet rechtstreeks MSAL. De overwegingen bij het cachen zijn hetzelfde.

Cachetypen voor tokens

MSAL.NET werkt met twee typen tokencaches: gebruiker en toepassing.

De toepassingstokencache die toegangstokens voor deze toepassing bevat. Het wordt stilzwijgend onderhouden en bijgewerkt wanneer AcquireTokenForClient wordt aangeroepen.

De gebruikerstokencache bevat id-tokens, toegangstokens en vernieuwingstokens voor accounts MSAL.NET interactie heeft. Deze wordt indien nodig op de achtergrond gebruikt en bijgewerkt wanneer u AcquireTokenSilent aanroept. Het wordt bijgewerkt door elke tokenovernamemethode, met uitzondering van AcquireTokenForClient die alleen gebruikmaakt van de toepassingscache.

Volgende stappen 

De volgende voorbeelden illustreren serialisatie van tokencache.

Sample Platform Description
active-directory-dotnet-desktop-msgraph-v2 Bureaublad (WPF) Windows Desktop .NET -toepassing (WPF) die de Microsoft-Graph API aanroept. Diagram van een topologie met een desktop-appclient die naar Microsoft Entra ID loopt om interactief een token te verkrijgen, en naar Microsoft Graph.
active-directory-dotnet-v1-to-v2 Bureaublad (console) Verzameling van Visual Studio-oplossingen die de migratie van Azure AD v1.0-toepassingen (met ADAL.NET) naar Microsoft identity platform-toepassingen (met MSAL.NET) illustreren.
ms-identity-aspnet-webapp-openidconnect ASP.NET (net472) Voorbeeld van serialisatie van tokencache in een ASP.NET MVC toepassing (met behulp van MSAL.NET).