Sitzungs- und App-Zustand in ASP.NET CoreSession and app state in ASP.NET Core

Von Rick Anderson, Steve Smith, Diana LaRose und Luke LathamBy Rick Anderson, Steve Smith, Diana LaRose, and Luke Latham

Bei HTTP handelt es sich um ein zustandsloses Protokoll.HTTP is a stateless protocol. HTTP-Anforderungen sind ohne zusätzliche Schritte unabhängige Nachrichten, die keine Benutzerwerte oder App-Zustände beibehalten.Without taking additional steps, HTTP requests are independent messages that don't retain user values or app state. In diesem Artikel werden mehrere Ansätze zum Beibehalten von Benutzerdaten und App-Zuständen zwischen Anforderungen beschrieben.This article describes several approaches to preserve user data and app state between requests.

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)View or download sample code (how to download)

ZustandsverwaltungState management

Zustände können mithilfe mehrerer Ansätze gespeichert werden.State can be stored using several approaches. Die Ansätze werden im Verlauf dieses Artikels beschrieben.Each approach is described later in this topic.

SpeicheransatzStorage approach SpeichermechanismusStorage mechanism
CookiesCookies HTTP-Cookies (schließt möglicherweise Daten ein, die mit serverseitigem App-Code gespeichert wurden)HTTP cookies (may include data stored using server-side app code)
SitzungszustandSession state HTTP-Cookies und serverseitiger App-CodeHTTP cookies and server-side app code
TempDataTempData HTTP-Cookies oder SitzungszustandHTTP cookies or session state
AbfragezeichenfolgenQuery strings HTTP-AbfragezeichenfolgenHTTP query strings
Verborgene FelderHidden fields HTTP-FormularfelderHTTP form fields
HttpContext.ItemsHttpContext.Items Serverseitiger App-CodeServer-side app code
CacheCache Serverseitiger App-CodeServer-side app code
AbhängigkeitsinjektionDependency Injection Serverseitiger App-CodeServer-side app code

CookiesCookies

Cookies speichern Daten anforderungsübergreifend.Cookies store data across requests. Da mit jeder Anforderung Cookies gesendet werden, sollte deren Größe auf ein Minimum begrenzt sein.Because cookies are sent with every request, their size should be kept to a minimum. Idealerweise sollte nur ein Bezeichner in einem Cookie gespeichert werden, während die Daten von der App gespeichert werden sollten.Ideally, only an identifier should be stored in a cookie with the data stored by the app. Die meisten Browser beschränken die Größe von Cookies auf 4096 Byte.Most browsers restrict cookie size to 4096 bytes. Nur eine begrenzte Anzahl von Cookies ist für jede Domäne verfügbar.Only a limited number of cookies are available for each domain.

Da Cookies manipuliert werden können, müssen sie von der App überprüft werden.Because cookies are subject to tampering, they must be validated by the app. Cookies können von Benutzern gelöscht werden und können auf Clients ablaufen.Cookies can be deleted by users and expire on clients. Cookies sind für gewöhnlich die dauerhafteste Form der Datenpersistenz auf dem Client.However, cookies are generally the most durable form of data persistence on the client.

Cookies werden häufig aus Personalisierungsgründen verwendet, wenn Inhalt für einen bekannten Benutzer angepasst wird.Cookies are often used for personalization, where content is customized for a known user. In den meisten Fällen wird der Benutzer nur identifiziert und nicht authentifiziert.The user is only identified and not authenticated in most cases. Das Cookie kann den Benutzernamen, Kontonamen oder eine eindeutige Benutzer-ID (z.B. die GUID) speichern.The cookie can store the user's name, account name, or unique user ID (such as a GUID). Dann können Sie mit dem Cookie auf die persönlichen Einstellungen (z.B. die bevorzugte Farbe des Websitehintergrunds) des Benutzers zugreifen.You can then use the cookie to access the user's personalized settings, such as their preferred website background color.

Beachten Sie die Europäische Datenschutz-Grundverordnung (DSGVO) beim Ausstellen von Cookies und beim Umgang mit Aspekten des Datenschutzes.Be mindful of the European Union General Data Protection Regulations (GDPR) when issuing cookies and dealing with privacy concerns. Weitere In finden Sie unter General Data Protection Regulation (GDPR) support in ASP.NET Core (DSGVO-Unterstützung in ASP.NET Core).For more information, see General Data Protection Regulation (GDPR) support in ASP.NET Core.

SitzungszustandSession state

Der Sitzungszustand ist ein Szenario in ASP.NET Core zum Speichern von Benutzerdaten, wenn der Benutzer eine Web-App verwendet.Session state is an ASP.NET Core scenario for storage of user data while the user browses a web app. Der Sitzungszustand verwendet einen von der App verwalteten Speicher, um Daten für mehrere Anforderungen eines Clients beizubehalten.Session state uses a store maintained by the app to persist data across requests from a client. Die Sitzungsdaten werden in einem Cache zwischengespeichert und sind kurzlebig. Die Website sollte auch ohne die Sitzungsdaten weiterhin funktionieren.The session data is backed by a cache and considered ephemeral data—the site should continue to function without the session data. Kritische Anwendungsdaten sollten in der Benutzerdatenbank gespeichert und nur zur Leistungsoptimierung in der Sitzung zwischengespeichert werden.Critical application data should be stored in the user database and cached in session only as a performance optimization.

Hinweis

Sitzungen werden in SignalR-Apps nicht unterstützt, weil ein SignalR-Hub unabhängig vom HTTP-Kontext ausgeführt werden kann.Session isn't supported in SignalR apps because a SignalR Hub may execute independent of an HTTP context. Das kann z.B. passieren, wenn eine lange Abrufanforderung von einem Hub länger als die Lebensdauer des HTTP-Kontexts einer Anforderung offen gehalten wird.For example, this can occur when a long polling request is held open by a hub beyond the lifetime of the request's HTTP context.

ASP.NET Core verwaltet den Sitzungszustand, indem ein Cookie an den Client übergeben wird, das die Sitzungs-ID enthält, die mit jeder Anforderung an den Server gesendet wird.ASP.NET Core maintains session state by providing a cookie to the client that contains a session ID, which is sent to the app with each request. Die App verwendet die Sitzungs-ID, um die Sitzungsdaten abzurufen.The app uses the session ID to fetch the session data.

Der Sitzungszustand verhält sich wie folgt:Session state exhibits the following behaviors:

  • Da das Sitzungscookie browserspezifisch ist, können Sitzungen nicht für mehrere Browser gleichzeitig verwendet werden.Because the session cookie is specific to the browser, sessions aren't shared across browsers.
  • Sitzungscookies werden gelöscht, wenn die Browsersitzung abläuft.Session cookies are deleted when the browser session ends.
  • Wenn für eine abgelaufene Sitzung ein Cookie empfangen wird, wird eine neue Sitzung erstellt, die dasselbe Cookie verwendet.If a cookie is received for an expired session, a new session is created that uses the same session cookie.
  • Leere Sitzungen werden nicht beibehalten. Die Sitzung muss mindestens einen Wert enthalten, damit die Sitzung anforderungsübergreifend beibehalten wird.Empty sessions aren't retained—the session must have at least one value set into it to persist the session across requests. Wenn eine Sitzung nicht beibehalten wird, wird eine neue Sitzungs-ID für jede neue Anforderung erzeugt.When a session isn't retained, a new session ID is generated for each new request.
  • Die App speichert Sitzungen für einen beschränkten Zeitraum nach der letzten Anforderung.The app retains a session for a limited time after the last request. Die App legt entweder ein Zeitlimit für die Sitzungen fest oder verwendet den Standardwert von 20 Minuten.The app either sets the session timeout or uses the default value of 20 minutes. Der Sitzungszustand eignet sich ideal zum Speichern von Benutzerdaten, die für eine bestimmte Sitzung zwar wichtig sind, die jedoch nicht dauerhaft sitzungsübergreifend gespeichert werden müssen.Session state is ideal for storing user data that's specific to a particular session but where the data doesn't require permanent storage across sessions.
  • Sitzungsdaten werden entweder gelöscht, wenn die ISession.Clear-Implementierung aufgerufen wird oder wenn die Sitzung abläuft.Session data is deleted either when the ISession.Clear implementation is called or when the session expires.
  • Es gibt kein Standardverfahren, wie App-Code darüber informiert wird, dass ein Clientbrowser geschlossen wurde oder dass ein Sitzungscookie gelöscht wurde oder auf dem Client abgelaufen ist.There's no default mechanism to inform app code that a client browser has been closed or when the session cookie is deleted or expired on the client.
  • Die Vorlagen für ASP.NET Core MVC- und Razor-Seiten bieten Unterstützung für die Datenschutz-Grundverordnung (DSGVO).The ASP.NET Core MVC and Razor pages templates include support for General Data Protection Regulation (GDPR). Sitzungsstatuscookies werden nicht standardmäßig als wichtig markiert, sodass der Sitzungsstatus erst dann eine Funktion hat, wenn der Besucher der Website die Nachverfolgung zulässt.Session state cookies aren't marked essential by default, so session state isn't functional unless tracking is permitted by the site visitor. Weitere Informationen finden Sie unter Datenschutz-Grundverordnung (DSGVO)-Unterstützung in ASP.NET Core.For more information, see Datenschutz-Grundverordnung (DSGVO)-Unterstützung in ASP.NET Core.

Warnung

Speichern Sie keine vertraulichen Daten im Sitzungszustand.Don't store sensitive data in session state. Es besteht die Möglichkeit, dass der Benutzer seinen Browser nicht schließt oder die Sitzungscookies nicht löscht.The user might not close the browser and clear the session cookie. Einige Browser behalten gültige Sitzungscookies browserfensterübergreifend bei.Some browsers maintain valid session cookies across browser windows. Eine Sitzung ist möglicherweise nicht nur auf einen Benutzer beschränkt, sodass der nächste Benutzer dasselbe Sitzungscookie verwendet.A session might not be restricted to a single user—the next user might continue to browse the app with the same session cookie.

Der Cacheanbieter im Arbeitsspeicher speichert Sitzungsdaten im Arbeitsspeicher des Servers, auf dem sich die App befindet.The in-memory cache provider stores session data in the memory of the server where the app resides. Beachten Sie in einem Szenario mit einer Serverfarm Folgendes:In a server farm scenario:

Konfigurieren des SitzungszustandsConfigure session state

Das Paket Microsoft.AspNetCore.Session, das im Metapaket Microsoft.AspNetCore.App enthalten ist, bietet Middleware zum Verwalten des Sitzungszustands.The Microsoft.AspNetCore.Session package, which is included in the Microsoft.AspNetCore.App metapackage, provides middleware for managing session state. Startup muss folgende Elemente enthalten, um die Sitzungsmiddleware zu aktivieren:To enable the session middleware, Startup must contain:

Der folgende Code zeigt, wie Sie den speicherinternen Sitzungsanbieter mit einer Standardimplementierung von IDistributedCache im Arbeitsspeicher einrichten:The following code shows how to set up the in-memory session provider with a default in-memory implementation of IDistributedCache:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
            // Make the session cookie essential
            options.Cookie.IsEssential = true;
        });

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSession();
        app.UseHttpContextItemsMiddleware();
        app.UseMvc();
    }
}

Die Reihenfolge der Middleware ist wichtig.The order of middleware is important. Im vorherigen Beispiel kommt es zu einer InvalidOperationException-Ausnahme, wenn UseSession nach UseMvc aufgerufen wird.In the preceding example, an InvalidOperationException exception occurs when UseSession is invoked after UseMvc. Weitere Informationen finden Sie unter Middleware.For more information, see Middleware Ordering.

HttpContext.Session ist verfügbar, nachdem der Sitzungszustand konfiguriert wurde.HttpContext.Session is available after session state is configured.

Auf HttpContext.Session kann vor einem Aufruf von UseSession nicht zugegriffen werden.HttpContext.Session can't be accessed before UseSession has been called.

Nachdem die App mit dem Schreiben in den Antwortdatenstrom begonnen hat, kann keine neue Sitzung mit einem neuen Sitzungscookie erstellt werden.A new session with a new session cookie can't be created after the app has begun writing to the response stream. Die Ausnahme wird im Webserverprotokoll erfasst und nicht im Browser angezeigt.The exception is recorded in the web server log and not displayed in the browser.

Asynchrones Laden des SitzungszustandsLoad session state asynchronously

Der Standardsitzungsanbieter in ASP.NET Core lädt Sitzungsaufzeichnungen aus dem zugrunde liegenden IDistributedCache-Sicherungsspeicher nur asynchron, wenn die ISession.LoadAsync-Methode explizit vor den Methoden TryGetValue, Set oder Remove aufgerufen wird.The default session provider in ASP.NET Core loads session records from the underlying IDistributedCache backing store asynchronously only if the ISession.LoadAsync method is explicitly called before the TryGetValue, Set, or Remove methods. Wenn LoadAsync nicht zuerst aufgerufen wird, werden die zugrunde liegenden Sitzungsaufzeichnungen synchron geladen, was entsprechende Auswirkungen auf die Leistung haben kann.If LoadAsync isn't called first, the underlying session record is loaded synchronously, which can incur a performance penalty at scale.

Damit Apps dieses Muster erzwingen, umschließen Sie die Implementierungen DistributedSessionStore und DistributedSession mit Versionen, die eine Ausnahme auslösen, wenn die LoadAsync-Methode nicht vor TryGetValue, Set oder Remove aufgerufen wird.To have apps enforce this pattern, wrap the DistributedSessionStore and DistributedSession implementations with versions that throw an exception if the LoadAsync method isn't called before TryGetValue, Set, or Remove. Registrieren Sie die umschlossenen Versionen in den Dienstcontainern.Register the wrapped versions in the services container.

SitzungsoptionenSession options

Verwenden Sie Sitzungsoptionen, um Standardwerte für Sitzungen zu überschreiben.To override session defaults, use SessionOptions.

OptionOption BeschreibungDescription
CookieCookie Bestimmt die Einstellungen, die zum Erstellen des Cookies verwendet wurden.Determines the settings used to create the cookie. Der Standardwert von Name ist SessionDefaults.CookieName (.AspNetCore.Session).Name defaults to SessionDefaults.CookieName (.AspNetCore.Session). Der Standardwert von Path ist SessionDefaults.CookiePath (/).Path defaults to SessionDefaults.CookiePath (/). Der Standardwert von SameSite ist SameSiteMode.Lax (1).SameSite defaults to SameSiteMode.Lax (1). Der Standardwert von HttpOnly ist true.HttpOnly defaults to true. Der Standardwert von IsEssential ist false.IsEssential defaults to false.
IdleTimeoutIdleTimeout IdleTimeout gibt an, wie lang die Sitzung sich im Leerlauf befinden darf, bevor die Inhalte verworfen werden.The IdleTimeout indicates how long the session can be idle before its contents are abandoned. Jeder Zugriff auf eine Sitzung setzt das Zeitlimit zurück.Each session access resets the timeout. Diese Einstellung gilt nur für den Inhalt der Sitzung und nicht für den Cookie.This setting only applies to the content of the session, not the cookie. Der Standardwert beträgt 20 Minuten.The default is 20 minutes.
IOTimeoutIOTimeout Das Zeitlimit, wie lange eine Sitzung aus dem Speicher geladen werden soll oder wie lange sie in den Speicher committet werden soll.The maximim amount of time allowed to load a session from the store or to commit it back to the store. Diese Einstellung gilt möglicherweise nur für asynchrone Vorgänge.This setting may only apply to asynchronous operations. Dieses Zeitlimit kann mit InfiniteTimeSpan deaktiviert werden.This timeout can be disabled using InfiniteTimeSpan. Der Standardwert beträgt 1 Minute.The default is 1 minute.

Die Sitzung verwendet ein Cookie, um Anforderungen eines Browsers nachzuverfolgen und zu identifizieren.Session uses a cookie to track and identify requests from a single browser. Standardmäßig wird das Cookie .AspNetCore.Session genannt und verwendet den Pfad von /.By default, this cookie is named .AspNetCore.Session, and it uses a path of /. Da das Standardcookie keine Domäne festlegt, wird es dem clientseitigen Skript auf der Seite nicht zur Verfügung gestellt, da der Standardwert von HttpOnly true ist.Because the cookie default doesn't specify a domain, it isn't made available to the client-side script on the page (because HttpOnly defaults to true).

Verwenden Sie SessionOptions, um Standardwerte für Sitzungscookies zu überschreiben:To override cookie session defaults, use SessionOptions:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDistributedMemoryCache();

    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddSession(options =>
    {
        options.Cookie.Name = ".AdventureWorks.Session";
        options.IdleTimeout = TimeSpan.FromSeconds(10);
        options.Cookie.IsEssential = true;
    });
}

Die App verwendet die IdleTimeout-Eigenschaft, um zu bestimmen, wie lange sich die Sitzung im Leerlauf befinden kann, bevor ihre Inhalte im Cache des Servers verworfen werden.The app uses the IdleTimeout property to determine how long a session can be idle before its contents in the server's cache are abandoned. Diese Eigenschaft ist unabhängig vom Ablauf der Cookies.This property is independent of the cookie expiration. Jede Anforderung, die über die Sitzungsmiddleware übergeben wird, setzt das Zeitlimit zurück.Each request that passes through the Session Middleware resets the timeout.

Der Sitzungszustand ist nicht sperrend.Session state is non-locking. Die letzte Anforderung überschreibt die erste, wenn zwei Anforderungen gleichzeitig versuchen, die Inhalte einer Sitzung zu bearbeiten.If two requests simultaneously attempt to modify the contents of a session, the last request overrides the first. Session wird als kohärente Sitzung implementiert, d.h., dass alle Inhalte zusammen gespeichert werden.Session is implemented as a coherent session, which means that all the contents are stored together. Wenn zwei Anforderungen unterschiedliche Sitzungswerte bearbeiten möchten, überschreibt die letzte Anforderung möglicherweise Anforderungen der ersten.When two requests seek to modify different session values, the last request may override session changes made by the first.

Festlegen und Abrufen von SitzungswertenSet and get Session values

Sie können über die Razor Pages-Klasse PageModel oder die MVC-Klasse Controller mit HttpContext.Session auf den Sitzungszustand zugreifen.Session state is accessed from a Razor Pages PageModel class or MVC Controller class with HttpContext.Session. Bei der Eigenschaft handelt es sich um eine ISession-Implementierung.This property is an ISession implementation.

Die ISession-Implementierung bietet mehrere Erweiterungsmethoden zum Festlegen und Abrufen von Integerwerten und Zeichenfolgenwerten.The ISession implementation provides several extension methods to set and retrieve integer and string values. Die Erweiterungsmethoden befinden sich im Namespace Microsoft.AspNetCore.Http, wenn vom Projekt auf das Paket using Microsoft.AspNetCore.Http;Microsoft.AspNetCore.Http.Extensions verwiesen wird (fügen Sie eine -Anweisung hinzu, um Zugriff auf die Erweiterungsmethoden zu erhalten).The extension methods are in the Microsoft.AspNetCore.Http namespace (add a using Microsoft.AspNetCore.Http; statement to gain access to the extension methods) when the Microsoft.AspNetCore.Http.Extensions package is referenced by the project. Beide Pakete sind im Metapaket Microsoft.AspNetCore.App enthalten.Both packages are included in the Microsoft.AspNetCore.App metapackage.

ISession-Erweiterungsmethoden:ISession extension methods:

Mit dem folgenden Codebeispiel wird der Sitzungswert für den IndexModel.SessionKeyName-Schlüssel (_Name in der Beispiel-App) auf einer Razor Pages-Seite abgerufen:The following example retrieves the session value for the IndexModel.SessionKeyName key (_Name in the sample app) in a Razor Pages page:

@page
@using Microsoft.AspNetCore.Http
@model IndexModel

...

Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName)

Im folgenden Codebeispiel wird veranschaulicht, wie Sie eine ganze Zahl und eine Zeichenfolge abrufen und festlegen können:The following example shows how to set and get an integer and a string:

public class IndexModel : PageModel
{
    public const string SessionKeyName = "_Name";
    public const string SessionKeyAge = "_Age";
    const string SessionKeyTime = "_Time";

    public string SessionInfo_Name { get; private set; }
    public string SessionInfo_Age { get; private set; }
    public string SessionInfo_CurrentTime { get; private set; }
    public string SessionInfo_SessionTime { get; private set; }
    public string SessionInfo_MiddlewareValue { get; private set; }

    public void OnGet()
    {
        // Requires: using Microsoft.AspNetCore.Http;
        if (string.IsNullOrEmpty(HttpContext.Session.GetString(SessionKeyName)))
        {
            HttpContext.Session.SetString(SessionKeyName, "The Doctor");
            HttpContext.Session.SetInt32(SessionKeyAge, 773);
        }

        var name = HttpContext.Session.GetString(SessionKeyName);
        var age = HttpContext.Session.GetInt32(SessionKeyAge);

Alle Sitzungsdaten müssen serialisiert werden, um ein Szenario mit einem verteilten Cache zu ermöglichen, auch wenn Sie den speicherinternen Cache verwenden.All session data must be serialized to enable a distributed cache scenario, even when using the in-memory cache. Die mindestens erforderlichen Zeichenfolgen- und Zahlenserialisierungsmodule werden bereitgestellt (siehe Methoden und Erweiterungsmethoden von ISession).Minimal string and number serializers are provided (see the methods and extension methods of ISession). Komplexe Typen müssen vom Benutzer mit einem anderen Verfahren wie etwa JSON serialisiert werden.Complex types must be serialized by the user using another mechanism, such as JSON.

Fügen Sie die folgenden Erweiterungsmethoden hinzu, um serialisierbare Objekte für eine Sitzung festzulegen und abzurufen:Add the following extension methods to set and get serializable objects:

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(this ISession session, string key)
    {
        var value = session.GetString(key);

        return value == null ? default(T) : 
            JsonConvert.DeserializeObject<T>(value);
    }
}

Im folgenden Beispiel wird dargestellt, wie Sie serialisierbare Objekte mit den Erweiterungsmethoden festlegen und abrufen:The following example shows how to set and get a serializable object with the extension methods:

// Requires you add the Set and Get extension method mentioned in the topic.
if (HttpContext.Session.Get<DateTime>(SessionKeyTime) == default(DateTime))
{
    HttpContext.Session.Set<DateTime>(SessionKeyTime, currentTime);
}

TempDataTempData

ASP.NET Core macht die TempData-Eigenschaft des Razor Pages-Seitenmodells oder TempData eines MVC-Controllers verfügbar.ASP.NET Core exposes the TempData property of a Razor Pages page model or TempData of an MVC controller. Diese Eigenschaft speichert Daten, bis sie gelesen wurden.This property stores data until it's read. Die Methoden Keep und Peek können verwendet werden, um die Daten zu überprüfen, ohne sie zu löschen.The Keep and Peek methods can be used to examine the data without deletion. TempData eignet sich besonders für die Weiterleitung, wenn Daten für mehr als eine Anforderung erforderlich sind.TempData is particularly useful for redirection when data is required for more than a single request. TempData wird von TempData-Anbietern implementiert, indem Cookies oder der Sitzungszustand verwendet werden.TempData is implemented by TempData providers using either cookies or session state.

TempData-AnbieterTempData providers

Der cookiebasierte TempData-Anbieter wird standardmäßig verwendet, um TempData in Cookies zu speichern.The cookie-based TempData provider is used by default to store TempData in cookies.

Die Cookiedaten werden mit IDataProtector verschlüsselt, mit Base64UrlTextEncoder codiert und anschließend in Blöcke unterteilt.The cookie data is encrypted using IDataProtector, encoded with Base64UrlTextEncoder, then chunked. Da das Cookie in Blöcke unterteilt wird, gilt die in ASP.NET Core 1.x gefundene Größenbeschränkung nicht für einzelne Cookies.Because the cookie is chunked, the single cookie size limit found in ASP.NET Core 1.x doesn't apply. Die Cookiedaten werden nicht komprimiert, da es zu Sicherheitsproblemen kommen kann, wenn Daten verschlüsselt werden, z.B. durch CRIME- und BREACH-Angriffe.The cookie data isn't compressed because compressing encrypted data can lead to security problems such as the CRIME and BREACH attacks. Weitere Informationen zum cookiebasierten TempData-Anbieter finden Sie unter CookieTempDataProvider.For more information on the cookie-based TempData provider, see CookieTempDataProvider.

Auswählen eines TempData-AnbietersChoose a TempData provider

Bevor Sie einen TempData-Anbieter auswählen, müssen Sie folgende Überlegungen anstellen:Choosing a TempData provider involves several considerations, such as:

  1. Verwendet die App bereits den Sitzungszustand?Does the app already use session state? Falls dies der Fall ist, hat die Verwendung des TempData-Anbieters abgesehen von der Größe der Daten keine zusätzlichen Auswirkungen auf die App.If so, using the session state TempData provider has no additional cost to the app (aside from the size of the data).
  2. Verwendet die App TempData nur selten für verhältnismäßig kleine Datenmengen (bis zu 500 Bytes)?Does the app use TempData only sparingly for relatively small amounts of data (up to 500 bytes)? Falls dies der Fall ist, entsteht durch das Cookie des TempData-Anbieters nur ein kleiner zusätzlicher Aufwand für jede Anforderung, die TempData enthält.If so, the cookie TempData provider adds a small cost to each request that carries TempData. Falls dies nicht der Fall ist, kann der Sitzungszustand des TempData-Anbieters nützlich sein, um Roundtrips für große Datenmengen für jede Anforderung durchzuführen, bis TempData verarbeitet wird.If not, the session state TempData provider can be beneficial to avoid round-tripping a large amount of data in each request until the TempData is consumed.
  3. Wird die App in einer Serverfarm auf mehreren Servern ausgeführt?Does the app run in a server farm on multiple servers? Wenn dies der Fall ist, ist keine weitere Konfiguration erforderlich, um das Cookie des TempData-Anbieters außerhalb des Schutzes von Daten zu verwenden (siehe ASP.NET Core-Datenschutz und Schlüsselspeicheranbieter).If so, there's no additional configuration required to use the cookie TempData provider outside of Data Protection (see ASP.NET Core-Datenschutz and Key storage providers).

Hinweis

Die meisten Webclients (z.B. Webbrowser) erzwingen Einschränkungen für die maximale Größe der Cookies, für die Gesamtanzahl der Cookies oder für beides.Most web clients (such as web browsers) enforce limits on the maximum size of each cookie, the total number of cookies, or both. Wenn Sie das Cookie des TempData-Anbieters verwenden, sollten Sie überprüfen, ob die App diese Einschränkungen überschreitet.When using the cookie TempData provider, verify the app won't exceed these limits. Beachten Sie die Gesamtgröße der Daten.Consider the total size of the data. Rechnen Sie mit erhöhter Cookiegröße aufgrund von Verschlüsselung und Segmentierung.Account for increases in cookie size due to encryption and chunking.

Konfigurieren des TempData-AnbietersConfigure the TempData provider

Der cookiebasierte TempData-Anbieter ist standardmäßig aktiviert.The cookie-based TempData provider is enabled by default.

Verwenden Sie die Erweiterungsmethode AddSessionStateTempDataProvider, um sitzungsbasierte TempData-Anbieter zu ermöglichen:To enable the session-based TempData provider, use the AddSessionStateTempDataProvider extension method:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        .AddSessionStateTempDataProvider();

    services.AddSession();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseSession();
    app.UseMvc();
}

Die Reihenfolge der Middleware ist wichtig.The order of middleware is important. Im vorherigen Beispiel kommt es zu einer InvalidOperationException-Ausnahme, wenn UseSession nach UseMvc aufgerufen wird.In the preceding example, an InvalidOperationException exception occurs when UseSession is invoked after UseMvc. Weitere Informationen finden Sie unter Middleware.For more information, see Middleware Ordering.

Wichtig

Wenn Sie für .NET Framework entwickeln und den sitzungsbasierten TempData-Anbieter verwenden, fügen Sie das Paket Microsoft.AspNetCore.Session zu Ihrem Projekt hinzu.If targeting .NET Framework and using the session-based TempData provider, add the Microsoft.AspNetCore.Session package to the project.

AbfragezeichenfolgenQuery strings

Eine begrenzte Menge an Daten kann von einer Anforderung an eine andere übergeben werden, indem Sie diese zu der Abfragezeichenfolge einer neuen Anforderung hinzufügen.A limited amount of data can be passed from one request to another by adding it to the new request's query string. Dies ist nützlich, um den Zustand dauerhaft zu erfassen und Links mit einem eingebetteten Zustand zuzulassen, die über E-Mail oder soziale Netzwerke geteilt werden sollen.This is useful for capturing state in a persistent manner that allows links with embedded state to be shared through email or social networks. Verwenden Sie keine Abfragezeichenfolgen für vertrauliche Daten, da URL-Abfragezeichenfolgen öffentlich sind.Because URL query strings are public, never use query strings for sensitive data.

Wenn Daten in Abfragezeichenfolgen eingefügt werden, können sie nicht nur versehentlich freigegeben werden, sondern es entstehen auch Gelegenheiten für Versuche einer websiteübergreifenden Anforderungsfälschung, wodurch Benutzer dazu gebracht werden können, auf bösartige Websites zuzugreifen, während sie authentifiziert sind.In addition to unintended sharing, including data in query strings can create opportunities for Cross-Site Request Forgery (CSRF) attacks, which can trick users into visiting malicious sites while authenticated. Angreifer können dann Benutzerdaten von der App stehlen oder schädliche Aktionen im Namen eines Benutzers durchführen.Attackers can then steal user data from the app or take malicious actions on behalf of the user. Jeder gespeicherte App- oder Sitzungszustand muss vor solchen Anforderungsfälschungen geschützt sein.Any preserved app or session state must protect against CSRF attacks. Weitere Informationen finden Sie unter Preventing Cross-Site Request Forgery (XSRF/CSRF) attacks (Verhindern von websiteübergreifenden Anforderungsfälschungen (XSRF/CSRF)).For more information, see Prevent Cross-Site Request Forgery (XSRF/CSRF) attacks.

Verborgene FelderHidden fields

Daten können in ausgeblendeten Formularfeldern gespeichert und an die nächste Anforderung zurückgesendet werden.Data can be saved in hidden form fields and posted back on the next request. Dies ist häufig in mehrseitigen Formularen der Fall.This is common in multi-page forms. Die App muss die in verborgenen Feldern gespeicherten Daten immer wieder überprüfen, da der Client die Daten manipulieren könnte.Because the client can potentially tamper with the data, the app must always revalidate the data stored in hidden fields.

HttpContext.ItemsHttpContext.Items

Die Auflistung HttpContext.Items wird verwendet, um Daten zu speichern, während eine einzelne Anforderung behandelt wird.The HttpContext.Items collection is used to store data while processing a single request. Die Inhalte der Auflistung werden nach der Verarbeitung jeder Anforderung verworfen.The collection's contents are discarded after a request is processed. Die Items-Auflistung wird häufig von Komponenten oder Middleware zur Kommunikation verwendet, wenn sie zu unterschiedlichen Zeitpunkten während einer Anforderung ausgeführt werden und es keinen direkten Weg gibt, Parameter zu übergeben.The Items collection is often used to allow components or middleware to communicate when they operate at different points in time during a request and have no direct way to pass parameters.

Im folgenden Beispiel fügt Middleware isVerified zur Auflistung Items hinzu.In the following example, middleware adds isVerified to the Items collection.

app.Use(async (context, next) =>
{
    // perform some verification
    context.Items["isVerified"] = true;
    await next.Invoke();
});

An einem späteren Punkt in der Pipeline kann eine andere Middleware den Wert von isVerified zugreifen:Later in the pipeline, another middleware can access the value of isVerified:

app.Run(async (context) =>
{
    await context.Response.WriteAsync($"Verified: {context.Items["isVerified"]}");
});

Für Middleware, die nur von einer App verwendet wird, werden string-Schlüssel akzeptiert.For middleware that's only used by a single app, string keys are acceptable. Middleware, die von mehreren App-Instanzen verwendet wird, sollte eindeutige Objektschlüssel verwenden, um Schlüsselkonflikte zu vermeiden.Middleware shared between app instances should use unique object keys to avoid key collisions. Das folgenden Beispiel zeigt, wie Sie einen eindeutigen Objektschlüssel verwenden, der in einer Middlewareklasse definiert wurde:The following example shows how to use a unique object key defined in a middleware class:

public class HttpContextItemsMiddleware
{
    private readonly RequestDelegate _next;
    public static readonly object HttpContextItemsMiddlewareKey = new Object();

    public HttpContextItemsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        httpContext.Items[HttpContextItemsMiddlewareKey] = "K-9";

        await _next(httpContext);
    }
}

public static class HttpContextItemsMiddlewareExtensions
{
    public static IApplicationBuilder 
        UseHttpContextItemsMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<HttpContextItemsMiddleware>();
    }
}

Anderer Code kann auf den Wert zugreifen, der in HttpContext.Items gespeichert ist, indem er den Schlüssel verwendet, der von der Middlewareklasse zur Verfügung gestellt wird:Other code can access the value stored in HttpContext.Items using the key exposed by the middleware class:

HttpContext.Items
    .TryGetValue(HttpContextItemsMiddleware.HttpContextItemsMiddlewareKey, 
        out var middlewareSetValue);
SessionInfo_MiddlewareValue = 
    middlewareSetValue?.ToString() ?? "Middleware value not set!";

Dieser Ansatz hat außerdem den Vorteil, dass das Verwenden von Schlüsselzeichenfolgen im Code vermieden wird.This approach also has the advantage of eliminating the use of key strings in the code.

cacheCache

Das Caching stellt eine effiziente Möglichkeit zum Speichern und Abrufen von Daten dar.Caching is an efficient way to store and retrieve data. Die App kann die Lebensdauer zwischengespeicherter Elemente bestimmen.The app can control the lifetime of cached items.

Zwischengespeicherte Daten sind nicht mit einer spezifischen Anforderung, einem spezifischen Benutzer oder einer spezifischen Sitzung verknüpft.Cached data isn't associated with a specific request, user, or session. Achten Sie darauf, dass Sie keine benutzerspezifischen Daten zwischenspeichern, die von den Anforderungen anderen Benutzer abgerufen werden können.Be careful not to cache user-specific data that may be retrieved by other users' requests.

Weitere Informationen finden Sie unter Zwischenspeichern von Antworten in ASP.NET Core.For more information, see Zwischenspeichern von Antworten in ASP.NET Core.

Dependency InjectionDependency Injection

Verwenden Sie Dependency Injection, um Daten für Benutzer bereitzustellen:Use Dependency Injection to make data available to all users:

  1. Definieren Sie einen Dienst, der die Daten enthält.Define a service containing the data. Definieren Sie z.B. die Klasse MyAppData:For example, a class named MyAppData is defined:

    public class MyAppData
    {
        // Declare properties and methods
    }
    
  2. Fügen Sie die Dienstklasse zu Startup.ConfigureServices hinzu:Add the service class to Startup.ConfigureServices:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<MyAppData>();
    }
    
  3. Verwenden Sie die Datendienstklasse:Consume the data service class:

    public class IndexModel : PageModel
    {
        public IndexModel(MyAppData myService)
        {
            // Do something with the service
            //    Examples: Read data, store in a field or property
        }
    }
    

Häufige FehlerCommon errors

  • „Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Microsoft.AspNetCore.Session.DistributedSessionStore'. (Dienst kann nicht für den Typ „Microsoft.Extensions.Caching.Distributed.IDistributedCache“ aufgelöst werden, während versucht wird, auf „Microsoft.AspNetCore.Session.DistributedSessionStore“ zuzugreifen.)"Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Microsoft.AspNetCore.Session.DistributedSessionStore'."

    Dieser Fehler entsteht in der Regel, wenn nicht alle IDistributedCache-Implementierungen konfiguriert werden.This is usually caused by failing to configure at least one IDistributedCache implementation. Weitere Informationen finden Sie unter Verteilte Zwischenspeicherung in ASP.NET Core und Zwischenspeichern in Speicher in ASP.NET Core.For more information, see Verteilte Zwischenspeicherung in ASP.NET Core and Zwischenspeichern in Speicher in ASP.NET Core.

  • Falls die Sitzungsmiddleware eine Sitzung nicht speichert (z.B. wenn der Sicherungsspeicher nicht verfügbar ist), protokolliert sie die Ausnahme, und die Anforderung wird ordnungsgemäß ausgeführt.In the event that the session middleware fails to persist a session (for example, if the backing store isn't available), the middleware logs the exception and the request continues normally. Das führt zu unvorhersehbarem Verhalten.This leads to unpredictable behavior.

    Nehmen wir an, dass ein Benutzer seinen Einkaufswagen in einer Sitzung speichert.For example, a user stores a shopping cart in session. Der Benutzer fügt ein Element zum Einkaufswagen hinzu, aber der Commit schlägt fehl.The user adds an item to the cart but the commit fails. Die App wird nicht über den Fehler informiert und meldet dem Benutzer, dass das Element zum Einkaufswagen hinzugefügt wurde. Dies stimmt jedoch nicht.The app doesn't know about the failure so it reports to the user that the item was added to their cart, which isn't true.

    Es wird empfohlen, nach Fehlern zu suchen, indem Sie await feature.Session.CommitAsync(); über App-Code aufrufen, wenn die App mit dem Schreiben in die Sitzung fertig ist.The recommended approach to check for errors is to call await feature.Session.CommitAsync(); from app code when the app is done writing to the session. CommitAsync löst eine Ausnahme aus, wenn der Sicherungsspeicher nicht verfügbar ist.CommitAsync throws an exception if the backing store is unavailable. Wenn CommitAsync fehlschlägt, kann die App die Ausnahme verarbeiten.If CommitAsync fails, the app can process the exception. LoadAsync wird unter den gleichen Bedingungen ausgelöst, wenn der Sicherungsspeicher nicht verfügbar ist.LoadAsync throws under the same conditions where the data store is unavailable.

Zusätzliche RessourcenAdditional resources

Hosten von ASP.NET Core in einer Webfarm