Belirteç önbelleği serileştirmesi

Microsoft Authentication Library (MSAL) bir belirteç aldıktan sonra bu belirteci önbelleğe alır. Genel istemci uygulamaları (masaüstü ve mobil uygulamalar), başka bir yöntemle belirteç almadan önce önbellekten belirteç almaya çalışmalıdır. Gizli istemci uygulamalarında edinme yöntemleri önbelleği kendileri yönetir. Bu makalede, MSAL.NET'de belirteç önbelleğinin varsayılan ve özel seri hale getirilmesi açıkılmaktadır.

Summary

Öneri:

Microsoft.Identity.Web.TokenCache NuGet paketi, Microsoft.Identity.Web kitaplığı içinde belirteç önbelleği serileştirmesi sağlar. Kitaplık hem ASP.NET Core hem de ASP.NET Klasik ile tümleştirme sağlar ve soyutlamaları diğer web uygulaması veya API çerçevelerini yönlendirmek için kullanılabilir.

Note

Aşağıdaki örnekler ASP.NET Core içindir. ASP.NET için kod benzerdir; referans uygulama için web uygulaması ms-identity-aspnet-wepapp-openidconnect örneğine bakın.

Uzantı yöntemi Description
AddInMemoryTokenCaches Belirteç depolama ve alma için bellekte geçici bir önbellek oluşturur. Bellek içi belirteç önbellekleri diğer önbellek türlerinden daha hızlıdır, ancak belirteçleri uygulama yeniden başlatmaları arasında kalıcı olmaz ve önbellek boyutunu denetleyemezsiniz. Bellek içi önbellekler, uygulama yeniden başlatmaları arasında belirteçlerin kalıcı olmasını gerektirmeyen uygulamalar için uygundur. AcquireTokenForClient kullanan hizmetler, daemon'lar ve diğerleri gibi makineden makineye kimlik doğrulama senaryolarına katılan uygulamalarda bellek içi belirteç önbelleği kullanın (istemci kimlik bilgileri verir). Bellek içi belirteç önbellekleri, örnek uygulamalar ve yerel uygulama geliştirme sırasında da iyidir. Microsoft. Identity.Web sürüm 1.19.0+ tüm uygulama örneklerinde bellek içi belirteç önbelleğini paylaşır.
AddSessionTokenCaches Belirteç önbelleği kullanıcı oturumuna bağlıdır. Kimlik belirteci çok sayıda claim içeriyorsa, tanımlama bilgisi çok büyük olacağından bu seçenek ideal değildir.
AddDistributedTokenCaches Belirteç önbelleği, ASP.NET Core IDistributedCache uygulamasına karşı bir bağdaştırıcıdır. Dağıtılmış bellek önbelleği, Redis önbelleği, dağıtılmış NCache veya SQL Server önbelleği arasında seçim yapmanıza olanak tanır. Uygulamalar hakkında IDistributedCache ayrıntılı bilgi için bkz . Dağıtılmış bellek önbelleği.

Bellek içi belirteç önbelleği

Bir ASP.NET Core uygulamasında başlangıç sınıfınınConfigureServices yönteminde bellek içi önbelleği kullanan bir kod örneği aşağıda verilmiştir:

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 yalnızca uygulama belirteçleri istemeniz durumunda üretim için uygundur. Kullanıcı belirteçleri kullanıyorsanız, dağıtılmış belirteç önbelleği kullanmayı göz önünde bulundurun.

Belirteç önbelleği yapılandırma kodu, ASP.NET Core web uygulamaları ile web API'leri arasında benzerdir.

Dağıtılmış belirteç önbellekleri

Olası dağıtılmış önbellek örnekleri aşağıda verilmiştir:

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

Daha fazla bilgi için bakınız:

Dağıtılmış önbellek kullanımı, 2-2. aşama belirteç önbelleğindekiASP.NET Core web uygulaması öğreticisinde yer alır.

Önbellek isabet oranlarını ve önbellek performansını izleme

MSAL, AuthenticationResult.AuthenticationResultMetadata nesnesinin bir parçası olarak önemli ölçümleri kullanıma sunar. Uygulamanızın durumunu değerlendirmek için bu ölçümleri günlüğe kaydedebilirsiniz.

Metric Meaning Ne zaman alarm tetiklemeli?
DurationTotalInMs Ağ çağrıları ve önbellek de dahil olmak üzere MSAL'de harcanan toplam süre. Genel yüksek gecikme alarmı (> 1 saniye). Değer belirteç kaynağına bağlıdır. Önbellekten: bir önbellek erişimi. Microsoft Entra ID: İki önbellek erişimi ve bir HTTP çağrısı. Ek bir HTTP çağrısı nedeniyle ilk çağrı (işlem başına) daha uzun sürer.
DurationInCacheInMs Uygulama geliştiricisi tarafından özelleştirilen belirteç önbelleğini yüklemek veya kaydetmek için harcanan süre (örneğin, Redis'e kaydedin). Ani artışlarda alarm.
DurationInHttpInMs Microsoft Entra ID HTTP çağrıları yapmak için harcanan zaman. Ani artışlarda alarm.
TokenSource Token’ın kaynağı. Belirteçler önbellekten çok daha hızlı alınır (örneğin, ~100 ms ile ~700 ms). Önbellek isabet oranını izlemek ve alarma almak için kullanılabilir. DurationTotalInMs ile kullanın.
CacheRefreshReason Kimlik sağlayıcısından erişim belirtecini getirme nedeni. TokenSource ile kullanın.

Boyut yaklaşıkları

Belirteç önbelleği kullanırken, özellikle yüksek oranda kullanılabilir ve dağıtılmış uygulamalar için önbelleğin olası boyutunu göz önünde bulundurmanız önemlidir. Kullanıcılar oturum açtığında, her kullanıcı için yaklaşık 7 KB boyutunda bir önbellek girişi olacaktır. Birkaç aşağı akış API'sini çağırıyorsanız boyut daha büyük olacaktır. Hizmetler arası kimlik doğrulaması için, her kiracı ve alt API için yaklaşık 2 KB boyutunda bir önbellek girdisi bulunacaktır.

Ayrıntılı tahminler aşağıda listelenmiştir.

Uygulama akışları (AcquireTokenForClient, AcquireTokenForManagedIdentity)

  • Yalnızca erişim belirteçleri önbelleğe alınır. Bir belirteç, kalıcı olarak depolandığında yaklaşık 2-3 KB boyutundadır. Uygulama istemci kimliği * kiracılar * alt akış kaynakları başına 1 belirteç olacaktır. Örneğin, 1000 kiracıya hizmet veren ve Graph ile SharePoint için belirteçlere ihtiyaç duyan çok kiracılı bir uygulama şu değeri kullanır: 3 KB * 1000 * 2, yani yaklaşık 6 MB.

Aşağı akış web API'leriniAcquireTokenByAuthCode () çağıran web sitesi

  • Erişim belirteçleri – 4 KB; Uygulama istemci kimliği * kullanıcı * kiracı * aşağı akış kaynağı başına 1 belirteç.
  • Yenileme belirteci – 2 KB; İstemci uygulama kimliği * kullanıcı başına 1 belirteç.
  • Kimlik belirteci – 2 KB; İstemci uygulama kimliği * kullanıcı * kullanıcının oturum açtığı kiracı sayısı başına 1 belirteç.

Note

Bunun için doğrudan MSAL değil, daha üst düzey API'lerin Microsoft.Identity.Web kullanılmasını kesinlikle öneririz. Önbelleğe alma konusunda dikkat edilmesi gerekenler aynıdır.

Diğer web API'lerini çağıran Web API'si (AcquireTokenOnBehalfOf)

Web sitesi senaryosunda olduğu gibi, ancak her kullanıcı için değil, her oturum için 1 düğüm olacaktır. Varsayılan olarak MSAL, bir oturumu üst akış beyanının karma değerini oluşturarak tanımlar, ancak bu değiştirilebilir. Bkz. Uzun Süre Çalışan OBO İşlemleri.

Note

Bunun için doğrudan MSAL değil, daha üst düzey API'lerin Microsoft.Identity.Web kullanılmasını kesinlikle öneririz. Önbelleğe alma konusunda dikkat edilmesi gerekenler aynıdır.

Belirteç önbelleği türleri

MSAL.NET iki tür belirteç önbelleğiyle çalışır: kullanıcı ve uygulama.

Bu uygulama için erişim belirteçlerini tutan uygulama belirteci önbelleği . AcquireTokenForClient çağrılırken sessizce korunur ve güncelleştirilir.

Kullanıcı belirteci önbelleği, MSAL.NET'in etkileşimde bulunduğu hesaplara ait kimlik belirteçlerini, erişim belirteçlerini ve yenileme belirteçlerini içerir. AcquireTokenSilent çağrılırken gerekirse sessizce kullanılır ve güncelleştirilir. Yalnızca uygulama önbelleğini kullanan AcquireTokenForClient dışında her belirteç alma yöntemi tarafından güncelleştirilir.

Sonraki Adımlar

Aşağıdaki örneklerde belirteç önbelleği serileştirme gösterilmektedir.

Sample Platform Description
active-directory-dotnet-desktop-msgraph-v2 Masaüstü (WPF) Microsoft Graph API'sini çağıran Windows masaüstü .NET (WPF) uygulaması. Masaüstü uygulama istemcisinin, etkileşimli olarak bir belirteç alarak Microsoft Entra ID'ye ve Microsoft Graph'a bağlandığı bir topolojiyi gösteren diyagram.
active-directory-dotnet-v1-to-v2 Masaüstü (konsol) Azure AD v1.0 uygulamalarının (ADAL.NET kullanarak) Microsoft kimlik platformu uygulamalara (MSAL.NET kullanarak) geçişini gösteren Visual Studio çözümleri kümesi.
ms-identity-aspnet-webapp-openidconnect ASP.NET (net472) bir ASP.NET MVC uygulamasında (MSAL.NET kullanarak) belirteç önbelleği serileştirme örneği.