Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Nachdem Microsoft Authentication Library (MSAL) (MSAL) ein Token abgerufen hat, wird dieses Token zwischengespeichert. Öffentliche Clientanwendungen (Desktop- und mobile Apps) sollten versuchen, ein Token aus dem Cache abzurufen, bevor ein Token durch eine andere Methode abgerufen wird. Methoden zum Abrufen in vertraulichen Clientanwendungen verwalten den Cache selbst. In diesem Artikel werden die Standard- und benutzerdefinierte Serialisierung des Tokencaches in MSAL.NET erläutert.
Zusammenfassung
Die Empfehlung lautet:
- Beim Schreiben mobiler Apps ist die Zwischenspeicherung bereits von MSAL vorkonfiguriert.
- Verwenden Sie beim Schreiben einer Desktopanwendung den plattformübergreifenden Tokencache, wie in Desktop-Apps erläutert.
- Verwenden Sie beim Schreiben neuer vertraulicher Clientanwendungen (Web-Apps, Web-APIsoder Dienst-zu-Dienst- oder Daemon-Apps) Microsoft. Identity.Web als API auf höherer Ebene. Es bietet auch Integration in ASP.NET Core, ASP.NET Classic und funktioniert auch eigenständig.
- Vorhandene vertrauliche Clientanwendungen, die MSAL.NET direkt nutzen, können dies weiterhin tun.
- Web-Apps und Web-APIs sollten einen verteilten Tokencache (z. B. Redis, SQL Server, Azure Cosmos DB) in Verbindung mit einem eingeschränkten Speichercache verwenden.
- Verschlüsselung im Ruhezustand kann optional mit ASP.NET Core Datenschutz konfiguriert werden.
- Web-Apps können sich auch auf Sitzungscookies verlassen; Diese Option wird jedoch aufgrund der Cookiegröße nicht empfohlen.
- Dienst-zu-Dienst- und Daemon-Apps können sich nur auf die Zwischenspeicherung des Arbeitsspeichers verlassen. Wenn Ihre App viele Mandanten bedient, konfigurieren Sie eine Eviction-Richtlinie.
- Verwaltete Identitätstoken werden nur im Arbeitsspeicher zwischengespeichert.
- Vertrauliche Clientanwendungen, die Microsoft.Identity.Web verwenden
- Vertrauliche Clientanwendungen mit MSAL.NET
- Desktop-App
- Mobile Apps
- Schreiben Sie Ihren eigenen Cache
Das NuGet-Paket Microsoft.Identity.Web.TokenCache stellt die Tokencache-Serialisierung innerhalb der Microsoft.Identity.Web-Bibliothek bereit. Die Bibliothek bietet Integration sowohl mit ASP.NET Core als auch mit ASP.NET Classic, und seine Abstraktionen können verwendet werden, um andere Web-App- oder API-Frameworks zu steuern.
Note
Die folgenden Beispiele beziehen sich auf ASP.NET Core. Für ASP.NET ist der Code ähnlich; eine Referenzimplementierung finden Sie unter the ms-identity-aspnet-wepapp-openidconnect web app sample.
| Erweiterungsmethode | Description |
|---|---|
| AddInMemoryTokenCaches | Erstellt einen temporären Cache im Arbeitsspeicher für die Tokenspeicherung und den Abruf. In-Memory-Tokencaches sind schneller als andere Cachetypen, aber ihre Token werden zwischen Anwendungsneustarts nicht beibehalten, und Sie können die Cachegröße nicht steuern. In-Memory-Caches eignen sich gut für Anwendungen, für die keine Token erforderlich sind, um zwischen App-Neustarts zu bestehen. Verwenden Sie in Anwendungen, die an Machine-to-Machine-Authentifizierungsszenarien wie Diensten, Daemons und anderen Anwendungen teilnehmen und AcquireTokenForClient verwenden, einen In-Memory-Tokencache (den Client Credentials-Flow). In-Memory-Tokencaches eignen sich auch für Beispielanwendungen und während der lokalen App-Entwicklung. Microsoft.Identity.Web-Versionen 1.19.0+ nutzen einen In-Memory-Tokencache über alle Anwendungsinstanzen hinweg gemeinsam. |
| AddSessionTokenCaches | Der Tokencache ist an die Benutzersitzung gebunden. Diese Option ist nicht ideal, wenn das ID-Token viele Ansprüche enthält, da das Cookie zu groß wird. |
AddDistributedTokenCaches |
Der Token-Cache ist ein Adapter für die ASP.NET Core-Implementierung IDistributedCache. Sie können zwischen einem verteilten Speichercache, einem Redis-Cache, einem verteilten NCache oder einem SQL Server Cache wählen. Ausführliche Informationen zu den IDistributedCache Implementierungen finden Sie unter "Verteilter Speichercache". |
Cache für In-Memory-Token
Nachfolgend finden Sie ein Beispiel für Code, der den Speichercache in der ConfigureServices-Methode der Startup-Klasse in einer ASP.NET Core Anwendung verwendet:
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 eignet sich in der Produktion, wenn Sie nur App-Token anfordern. Wenn Sie Benutzertoken verwenden, sollten Sie einen verteilten Tokencache verwenden.
Der Code für die Konfiguration des Tokencaches ist bei ASP.NET Core-Web-Apps und Web-APIs ähnlich.
Verteilte Tokencaches
Hier sind Beispiele für mögliche verteilte 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;
});
Weitere Informationen findest du unter:
- Verteilte Cacheverschlüsselung und andere erweiterte Optionen
- L2-Cache-Verdrängung verarbeiten
- Einrichten eines Redis-Caches in Docker
- Problembehandlung
Die Verwendung des verteilten Caches wird im Lernprogramm für ASP.NET Core Web App im Phase 2-2-Tokencache vorgestellt.
Überwachen der Cachetrefferverhältnisse und der Cacheleistung
MSAL macht wichtige Metriken als Teil des AuthenticationResult.AuthenticationResultMetadata-Objekts verfügbar. Sie können diese Metriken protokollieren, um den Status Ihrer Anwendung zu bewerten.
| Metric | Bedeutung | Wann wird ein Alarm ausgelöst? |
|---|---|---|
DurationTotalInMs |
Die gesamt für MSAL aufgewendete Zeit, einschließlich Netzwerkaufrufe und Cache. | Alarm bei gesamter hoher Latenz (> 1 Sekunde). Der Wert hängt von der Tokenquelle ab. Aus dem Cache: ein Cachezugriff. Von Microsoft Entra ID: zwei Cachezugriffe sowie einen HTTP-Aufruf. Der erste Aufruf (pro Prozess) dauert aufgrund eines zusätzlichen HTTP-Aufrufs länger. |
DurationInCacheInMs |
Zeit für das Laden oder Speichern des Tokencaches, der vom App-Entwickler angepasst wird (z. B. in Redis speichern). | Alarm bei Spitzen. |
DurationInHttpInMs |
Zeitaufwand für HTTP-Aufrufe an Microsoft Entra ID. | Alarm bei Spitzen. |
TokenSource |
Quelle des Tokens. Token werden viel schneller aus dem Cache abgerufen (z. B. ~100 ms im Vergleich zu ~700 ms). Kann zur Überwachung der Cache-Trefferrate und zum Auslösen von Alarmen verwendet werden. | Verwendung mit DurationTotalInMs. |
CacheRefreshReason |
Grund für das Abrufen des Zugriffstokens vom Identitätsanbieter. | Verwendung mit TokenSource. |
Größenannäherungen
Bei der Verwendung eines Tokencaches ist es wichtig, die potenzielle Größe des Caches zu berücksichtigen, insbesondere für hochverwendende und verteilte Anwendungen. Wenn sich Benutzer anmelden, gibt es für jeden Benutzer einen Cacheeintrag, der etwa 7 KB groß ist. Die Größe ist größer, wenn Sie mehrere downstream-APIs aufrufen. Für die Dienst-zu-Dienst-Authentifizierung gibt es einen Cacheeintrag für jeden Mandanten und jede downstream-API, etwa 2 KB groß.
Detaillierte Schätzungen sind unten aufgeführt.
Anwendungsflüsse (AcquireTokenForClient, AcquireTokenForManagedIdentity)
- Nur Zugriffstoken werden zwischengespeichert. Ein Token ist im persistierten Zustand ca. 2–3 KB groß. Pro App-Client-ID gibt es 1 Token * Mandanten * downstream-Ressourcen. Beispielsweise verwendet eine mehrinstanzenfähige App, die 1000 Mandanten bedient und Token für Graph und SharePoint benötigt: 3 KB * 1000 * 2, d. h. ca. 6 MB.
Website, die eine nachgelagerte Web-API aufruft (AcquireTokenByAuthCode)
- Zugriffstoken – 4 KB; 1 Token pro App-Client-ID * Benutzer * Mandant * Downstream-Ressource.
- Aktualisierungstoken – 2 KB; 1 Token pro Client-App-ID * Benutzer.
- ID-Token – 2 KB; 1 Token pro Client-App-ID * Benutzer * Anzahl der Mandanten, in denen sich dieser Benutzer anmeldet.
Note
Wir empfehlen dringend, hierfür die höherstufigen APIs von Microsoft.Identity.Web und nicht direkt MSAL zu verwenden. Die Überlegungen zum Zwischenspeichern sind identisch.
Web-API, die andere Web-API aufruft (AcquireTokenOnBehalfOf)
Identisch mit dem Websiteszenario, aber für jede Sitzung gibt es 1 Knoten, nicht für jeden Benutzer. Standardmäßig identifiziert MSAL eine Sitzung durch Hashing der Upstream-Assertion, dies kann jedoch geändert werden. Siehe lange laufende OBO-Prozesse.
Note
Wir empfehlen dringend, dafür die höherstufigen APIs von Microsoft.Identity.Web zu verwenden und nicht MSAL direkt. Die Überlegungen zum Zwischenspeichern sind identisch.
Tokencachetypen
MSAL.NET arbeitet mit zwei Arten von Tokencaches : Benutzer und Anwendung.
Der Anwendungstokencache , der Zugriffstoken für diese Anwendung enthält. Sie wird beim Aufrufen von AcquireTokenForClient unbemerkt beibehalten und aktualisiert.
Der Benutzertokencache enthält ID-Token, Zugriffstoken und Aktualisierungstoken für Konten, mit MSAL.NET interagiert. Sie wird beim Aufrufen von AcquireTokenSilent verwendet und bei Bedarf unbemerkt aktualisiert. Es wird von jeder Tokenakquisitionsmethode aktualisiert, mit Ausnahme von AcquireTokenForClient , die nur den Anwendungscache verwendet.
Nächste Schritte
Die folgenden Beispiele veranschaulichen die Serialisierung des Tokencaches.
| Beispiel | Platform | Description |
|---|---|---|
| active-directory-dotnet-desktop-msgraph-v2 | Desktop (WPF) | Windows Desktop-.NET-Anwendung (WPF), die microsoft Graph-API aufruft.
|
| active-directory-dotnet-v1-to-v2 | Desktop (Konsole) | Satz von Visual Studio Lösungen, die die Migration von Azure AD v1.0-Anwendungen (mithilfe von ADAL.NET) zu Microsoft Identity Platform Anwendungen (mit MSAL.NET) veranschaulichen. |
| ms-identity-aspnet-webapp-openidconnect | ASP.NET (net472) | Beispiel für die Serialisierung des Tokencaches in einer ASP.NET MVC-Anwendung (mithilfe von MSAL.NET). |