Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Mobil uygulamalar yazarken önbelleğe alma MSAL tarafından önceden yapılandırılmıştır.
- Masaüstü uygulaması yazarken, masaüstü uygulamalarında açıklandığı gibi platformlar arası belirteç önbelleğini kullanın.
- Yeni gizli istemci uygulamaları (web uygulamaları, web API'leri veya hizmetten hizmete ya da daemon uygulamaları) yazarken, daha üst düzey bir API olarak Microsoft.Identity.Web kullanın. ASP.NET Core, ASP.NET Classic ile tümleştirme sunar ve tek başına da çalışır.
- MSAL.NET doğrudan kullanan mevcut gizli istemci uygulamaları bunu yapmaya devam edebilir.
- Web uygulamaları ve web API'leri, kısıtlanmış bir bellek önbelleğiyle birlikte dağıtılmış bir belirteç önbelleği (örneğin, Redis, SQL Server, Azure Cosmos DB) kullanmalıdır.
- Bekleyen verilerin şifrelenmesi, ASP.NET Core Veri Koruması kullanılarak isteğe bağlı şekilde yapılandırılabilir.
- Web uygulamaları oturum tanımlama bilgilerini de kullanır; ancak tanımlama bilgisi boyutu nedeniyle bu seçenek önerilmez.
- Hizmet-hizmet ve daemon uygulamaları yalnızca bellek önbelleğe almayı kullanıyor olabilir. Uygulamanız birçok kiracıya hizmet ediyorsa bir çıkarma ilkesi yapılandırın.
- Yönetilen kimlik belirteçleri yalnızca bellekte önbelleğe alınır.
- Microsoft.Identity.Web kullanan gizli istemciler
- MSAL.NET kullanan gizli istemciler
- Masaüstü uygulamaları
- Mobil uygulamalar
- Kendi önbelleğinizi yazma
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 şifrelemesi ve diğer gelişmiş seçenekler
- L2 önbelleği çıkarmayı işleme
- Docker'da Redis önbelleği ayarlama
- Troubleshooting
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ı.
|
| 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. |