Verwenden der cookie Authentifizierung ohne ASP.NET Core IdentityUse cookie authentication without ASP.NET Core Identity

Von Rick AndersonBy Rick Anderson

ASP.NET Core Identity ist ein vollständiger Authentifizierungs Anbieter mit vollem Funktionsumfang zum Erstellen und warten von Anmeldungen.ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. Allerdings cookie kann ein-basierter Authentifizierungs Anbieter ohne ASP.NET Core Identity verwendet werden.However, a cookie-based authentication provider without ASP.NET Core Identity can be used. Weitere Informationen finden Sie unter Einführung in Identity ASP.net Core.For more information, see Einführung in Identity ASP.net Core.

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

Zu Demonstrationszwecken in der Beispiel-APP ist das Benutzerkonto für den hypothetischen Benutzer Maria Rodriguez in der APP hart codiert.For demonstration purposes in the sample app, the user account for the hypothetical user, Maria Rodriguez, is hardcoded into the app. Verwenden Sie die e-Mail- Adresse maria.rodriguez@contoso.com und jedes Kennwort, um den Benutzer anzumelden.Use the Email address maria.rodriguez@contoso.com and any password to sign in the user. Der Benutzer wird in der AuthenticateUser -Methode in der Datei pages/Account/Login. cshtml. cs authentifiziert.The user is authenticated in the AuthenticateUser method in the Pages/Account/Login.cshtml.cs file. In einem realen Beispiel wird der Benutzer für eine-Datenbank authentifiziert.In a real-world example, the user would be authenticated against a database.

KonfigurationConfiguration

Erstellen Sie in der Startup.ConfigureServices -Methode die Authentifizierungs-Middleware-Dienste mit der AddAuthentication -Methode und der-Methode AddCookie :In the Startup.ConfigureServices method, create the Authentication Middleware services with the AddAuthentication and AddCookie methods:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

AuthenticationScheme wird an AddAuthentication das Standard Authentifizierungsschema für die APP festgelegt.AuthenticationScheme passed to AddAuthentication sets the default authentication scheme for the app. AuthenticationScheme ist nützlich, wenn mehrere Instanzen der Authentifizierung vorhanden sind cookie und Sie die Autorisierung mit einem bestimmten Schema durchlaufen möchten.AuthenticationScheme is useful when there are multiple instances of cookie authentication and you want to authorize with a specific scheme. Durch Festlegen AuthenticationScheme von auf Cookie authenticationdefaults. authenticationScheme wird der Wert " Cookie s" für das Schema bereitstellt.Setting the AuthenticationScheme to CookieAuthenticationDefaults.AuthenticationScheme provides a value of "Cookies" for the scheme. Sie können einen beliebigen Zeichen folgen Wert angeben, der das Schema unterscheidet.You can supply any string value that distinguishes the scheme.

Das Authentifizierungsschema der APP unterscheidet sich vom cookie Authentifizierungsschema der app.The app's authentication scheme is different from the app's cookie authentication scheme. Wenn kein cookie Authentifizierungsschema für bereitgestellt AddCookie wird, verwendet es CookieAuthenticationDefaults.AuthenticationScheme (" Cookie s").When a cookie authentication scheme isn't provided to AddCookie, it uses CookieAuthenticationDefaults.AuthenticationScheme ("Cookies").

Die cookie -Eigenschaft der Authentifizierung IsEssential ist standardmäßig auf festgelegt true .The authentication cookie's IsEssential property is set to true by default. Authentifizierungs- cookie e sind zulässig, wenn ein Website Besucher der Datensammlung nicht zugestimmt hat.Authentication cookies are allowed when a site visitor hasn't consented to data collection. Weitere Informationen finden Sie unter Unterstützung für Datenschutz-Grundverordnung (dsgvo) in ASP.net Core.For more information, see Unterstützung für Datenschutz-Grundverordnung (dsgvo) in ASP.net Core.

In Startup.Configure werden UseAuthentication und aufgerufen UseAuthorization , um die-Eigenschaft festzulegen HttpContext.User und die Autorisierungs Middleware für Anforderungen auszuführen.In Startup.Configure, call UseAuthentication and UseAuthorization to set the HttpContext.User property and run Authorization Middleware for requests. Rufen Sie UseAuthentication die UseAuthorization Methoden und vor, bevor Sie aufrufen UseEndpoints :Call the UseAuthentication and UseAuthorization methods before calling UseEndpoints:

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapRazorPages();
});

Die- CookieAuthenticationOptions Klasse wird verwendet, um die Authentifizierungs Anbieter Optionen zu konfigurieren.The CookieAuthenticationOptions class is used to configure the authentication provider options.

Legen Sie CookieAuthenticationOptions in der Dienst Konfiguration für die Authentifizierung in der- Startup.ConfigureServices Methode fest:Set CookieAuthenticationOptions in the service configuration for authentication in the Startup.ConfigureServices method:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        ...
    });

Cookie Richtlinien MiddlewareCookie Policy Middleware

Die Cookie Richtlinien Middleware ermöglicht cookie Richtlinien Funktionen.Cookie Policy Middleware enables cookie policy capabilities. Beim Hinzufügen der Middleware zur APP-Verarbeitungs Pipeline ist die Reihenfolge vertraulich, dass — Sie nur die in der Pipeline registrierten Downstreamkomponenten betrifft.Adding the middleware to the app processing pipeline is order sensitive—it only affects downstream components registered in the pipeline.

app.UseCookiePolicy(cookiePolicyOptions);

Verwenden CookiePolicyOptions Sie für die Cookie Richtlinien Middleware, um globale Merkmale der Verarbeitung zu steuern, cookie und schließen Sie cookie Verarbeitungs Handler ein, wenn e angefügt cookie oder gelöscht werden.Use CookiePolicyOptions provided to the Cookie Policy Middleware to control global characteristics of cookie processing and hook into cookie processing handlers when cookies are appended or deleted.

Der Standard MinimumSameSitePolicy Wert ist SameSiteMode.Lax , um die OAuth2-Authentifizierung zuzulassen.The default MinimumSameSitePolicy value is SameSiteMode.Lax to permit OAuth2 authentication. Um eine Richtlinie für denselben Standort von streng zu erzwingen SameSiteMode.Strict , legen Sie den fest MinimumSameSitePolicy .To strictly enforce a same-site policy of SameSiteMode.Strict, set the MinimumSameSitePolicy. Obwohl diese Einstellung OAuth2 und andere Ursprungs übergreifende Authentifizierungs Schemas unterbricht, erhöht Sie die Sicherheitsstufe cookie für andere Typen von apps, die sich nicht auf die Verarbeitung von Ursprungs übergreifenden Anforderungen stützen.Although this setting breaks OAuth2 and other cross-origin authentication schemes, it elevates the level of cookie security for other types of apps that don't rely on cross-origin request processing.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

Die Cookie Einstellung der Richtlinien Middleware für MinimumSameSitePolicy kann die Einstellung von Cookie.SameSite in den CookieAuthenticationOptions Einstellungen entsprechend der folgenden Matrix beeinflussen.The Cookie Policy Middleware setting for MinimumSameSitePolicy can affect the setting of Cookie.SameSite in CookieAuthenticationOptions settings according to the matrix below.

MinimumsamesitepolicyMinimumSameSitePolicy Cookie. SameSiteCookie.SameSite Ergebnis Cookie . SameSite-EinstellungResultant Cookie.SameSite setting
Samesitemode. NoneSameSiteMode.None Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. LaxSameSiteMode.Lax Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict

Erstellen einer Authentifizierung cookieCreate an authentication cookie

Erstellen Sie eine, um eine zu erstellen cookie , die Benutzerinformationen enthält ClaimsPrincipal .To create a cookie holding user information, construct a ClaimsPrincipal. Die Benutzerinformationen werden serialisiert und in gespeichert cookie .The user information is serialized and stored in the cookie.

Erstellen ClaimsIdentity Sie mit allen erforderlichen Claim s, und rufen SignInAsync Sie auf, um den Benutzer anzumelden:Create a ClaimsIdentity with any required Claims and call SignInAsync to sign in the user:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.

    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
    // The time at which the authentication ticket expires. A 
    // value set here overrides the ExpireTimeSpan option of 
    // CookieAuthenticationOptions set with AddCookie.

    //IsPersistent = true,
    // Whether the authentication session is persisted across 
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.

    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.

    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http 
    // redirect response value.
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

Wenn Sie möchten, dass Codekommentare in anderen Sprachen als Englisch angezeigt werden, informieren Sie uns in diesem GitHub-Issue.If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.

SignInAsync erstellt eine verschlüsselte cookie und fügt Sie der aktuellen Antwort hinzu.SignInAsync creates an encrypted cookie and adds it to the current response. Wenn AuthenticationScheme nicht angegeben ist, wird das Standardschema verwendet.If AuthenticationScheme isn't specified, the default scheme is used.

RedirectUri wird standardmäßig nur für einige bestimmte Pfade verwendet, z. b. für den Anmelde Pfad und die Abmelde Pfade.RedirectUri is only used on a few specific paths by default, for example, the login path and logout paths. Weitere Informationen finden Sie in der Cookie authenticationhandler-Quelle.For more information see the CookieAuthenticationHandler source.

ASP.net Core- Datenschutz System wird für die Verschlüsselung verwendet.ASP.NET Core's Data Protection system is used for encryption. Konfigurieren Sie für eine APP, die auf mehreren Computern gehostet wird, den Lastenausgleich über apps oder eine Webfarm, den Datenschutz so, dass derselbe Schlüsselbund und der APP-Bezeichner verwendet werden.For an app hosted on multiple machines, load balancing across apps, or using a web farm, configure data protection to use the same key ring and app identifier.

AbmeldenSign out

Um den aktuellen Benutzer zu abmelden und dessen zu löschen, wenden Sie Folgendes an cookie SignOutAsync :To sign out the current user and delete their cookie, call SignOutAsync:

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Wenn CookieAuthenticationDefaults.AuthenticationScheme (oder " Cookie s") nicht als Schema verwendet wird (z. b. "Configuration Manager" Cookie ), geben Sie das Schema an, das beim Konfigurieren des Authentifizierungs Anbieters verwendet wird.If CookieAuthenticationDefaults.AuthenticationScheme (or "Cookies") isn't used as the scheme (for example, "ContosoCookie"), supply the scheme used when configuring the authentication provider. Andernfalls wird das Standardschema verwendet.Otherwise, the default scheme is used.

Wenn der Browser geschlossen cookie wird, werden Sitzungs basierte s (nicht persistente cookie e) automatisch gelöscht, aber keine cookie s, wenn eine einzelne Registerkarte geschlossen wird.When the browser closes it automatically deletes session based cookies (non-persistent cookies), but no cookies are cleared when an individual tab is closed. Der Server wird nicht über Registerkarten-oder Browser schließen-Ereignisse benachrichtigt.The server is not notified of tab or browser close events.

Reagieren auf Back-End-ÄnderungenReact to back-end changes

Nachdem ein cookie erstellt wurde, cookie ist die einzige Quelle der Identität.Once a cookie is created, the cookie is the single source of identity. Wenn ein Benutzerkonto in Back-End-Systemen deaktiviert ist:If a user account is disabled in back-end systems:

  • Das cookie Authentifizierungssystem der APP verarbeitet weiterhin Anforderungen auf der Grundlage der Authentifizierung cookie .The app's cookie authentication system continues to process requests based on the authentication cookie.
  • Der Benutzer bleibt bei der App angemeldet, solange die Authentifizierung cookie gültig ist.The user remains signed into the app as long as the authentication cookie is valid.

Das ValidatePrincipal -Ereignis kann verwendet werden, um die Validierung der Identität abzufangen und zu überschreiben cookie .The ValidatePrincipal event can be used to intercept and override validation of the cookie identity. Das Überprüfen von cookie bei jeder Anforderung verringert das Risiko, dass widerrufene Benutzer auf die App zugreifen.Validating the cookie on every request mitigates the risk of revoked users accessing the app.

Ein Ansatz zur cookie Validierung basiert auf der Verfolgung, wann die Benutzerdatenbank geändert wird.One approach to cookie validation is based on keeping track of when the user database changes. Wenn die Datenbank nicht geändert wurde, seit Sie cookie ausgestellt wurde, ist es nicht erforderlich, den Benutzer erneut zu authentifizieren, wenn der Benutzer cookie noch gültig ist.If the database hasn't been changed since the user's cookie was issued, there's no need to re-authenticate the user if their cookie is still valid. In der Beispiel-APP wird die Datenbank in implementiert IUserRepository und speichert einen LastChanged Wert.In the sample app, the database is implemented in IUserRepository and stores a LastChanged value. Wenn ein Benutzer in der Datenbank aktualisiert wird, LastChanged wird der Wert auf die aktuelle Zeit festgelegt.When a user is updated in the database, the LastChanged value is set to the current time.

Um eine für ungültig zu erklären cookie , wenn sich die Datenbank auf der Grundlage des- LastChanged Werts ändert, erstellen Sie cookie mit einem Anspruch, der LastChanged den aktuellen LastChanged Wert aus der Datenbank enthält:In order to invalidate a cookie when the database changes based on the LastChanged value, create the cookie with a LastChanged claim containing the current LastChanged value from the database:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

var claimsIdentity = new ClaimsIdentity(
    claims, 
    CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

Um eine außer Kraft setzung für das-Ereignis zu implementieren ValidatePrincipal , schreiben Sie eine-Methode mit der folgenden Signatur in eine Klasse, die von abgeleitet ist CookieAuthenticationEvents :To implement an override for the ValidatePrincipal event, write a method with the following signature in a class that derives from CookieAuthenticationEvents:

ValidatePrincipal(CookieValidatePrincipalContext)

Im folgenden finden Sie eine Beispiel Implementierung von CookieAuthenticationEvents :The following is an example implementation of CookieAuthenticationEvents:

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        // Get the database from registered DI services.
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

Registrieren Sie die Ereignis Instanz während cookie der Dienst Registrierung in der- Startup.ConfigureServices Methode.Register the events instance during cookie service registration in the Startup.ConfigureServices method. Stellen Sie eine Bereichs bezogene Dienst Registrierung für die CustomCookieAuthenticationEvents Klasse bereit:Provide a scoped service registration for your CustomCookieAuthenticationEvents class:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

services.AddScoped<CustomCookieAuthenticationEvents>();

Stellen Sie sich eine Situation vor, in der der Name des Benutzers — eine Entscheidung aktualisiert, die die Sicherheit in keiner Weise beeinträchtigt.Consider a situation in which the user's name is updated—a decision that doesn't affect security in any way. Wenn Sie den Benutzer Prinzipal nicht dedestruktiv aktualisieren möchten, müssen Sie aufrufen context.ReplacePrincipal und die- context.ShouldRenew Eigenschaft auf festlegen true .If you want to non-destructively update the user principal, call context.ReplacePrincipal and set the context.ShouldRenew property to true.

Warnung

Der hier beschriebene Ansatz wird bei jeder Anforderung ausgelöst.The approach described here is triggered on every request. cookieDas Überprüfen der Authentifizierungs-e für alle Benutzer bei jeder Anforderung kann zu einer hohen Leistungs Einbuße für die APP führen.Validating authentication cookies for all users on every request can result in a large performance penalty for the app.

Persistente cookie sPersistent cookies

Es kann sein, dass die cookie über Browsersitzungen hinweg beibehalten werden soll.You may want the cookie to persist across browser sessions. Diese Persistenz sollte nur mit der expliziten Zustimmung des Benutzers mit dem Kontrollkästchen "merken" bei der Anmeldung oder einem ähnlichen Mechanismus aktiviert werden.This persistence should only be enabled with explicit user consent with a "Remember Me" check box on sign in or a similar mechanism.

Mit dem folgenden Code Ausschnitt werden eine Identität und eine entsprechende Identität erstellt cookie , die bei Browser Abschlüssen nicht angezeigt wird.The following code snippet creates an identity and corresponding cookie that survives through browser closures. Alle zuvor konfigurierten gleitenden Ablauf Einstellungen werden berücksichtigt.Any sliding expiration settings previously configured are honored. Wenn das cookie abläuft, während der Browser geschlossen wird, löscht der Browser den, cookie nachdem er neu gestartet wurde.If the cookie expires while the browser is closed, the browser clears the cookie once it's restarted.

IsPersistentAuf true in festlegen AuthenticationProperties :Set IsPersistent to true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

Absoluter cookie AblaufAbsolute cookie expiration

Eine absolute Ablaufzeit kann mit festgelegt werden ExpiresUtc .An absolute expiration time can be set with ExpiresUtc. Zum Erstellen eines persistenten cookie IsPersistent muss ebenfalls festgelegt werden.To create a persistent cookie, IsPersistent must also be set. Andernfalls wird das cookie mit einer Sitzungs basierten Lebensdauer erstellt und kann entweder vor oder nach dem Authentifizierungs Ticket ablaufen, das es enthält.Otherwise, the cookie is created with a session-based lifetime and could expire either before or after the authentication ticket that it holds. Wenn ExpiresUtc festgelegt ist, wird der Wert der- ExpireTimeSpan Option von CookieAuthenticationOptions , sofern festgelegt, überschrieben.When ExpiresUtc is set, it overrides the value of the ExpireTimeSpan option of CookieAuthenticationOptions, if set.

Der folgende Code Ausschnitt erstellt eine Identität und entsprechende cookie , die 20 Minuten dauert.The following code snippet creates an identity and corresponding cookie that lasts for 20 minutes. Dadurch werden alle zuvor konfigurierten gleitenden Ablauf Einstellungen ignoriert.This ignores any sliding expiration settings previously configured.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

ASP.NET Core Identity ist ein vollständiger Authentifizierungs Anbieter mit vollem Funktionsumfang zum Erstellen und warten von Anmeldungen.ASP.NET Core Identity is a complete, full-featured authentication provider for creating and maintaining logins. Allerdings cookie kann ein-basierter Authentifizierungs Anbieter ohne ASP.NET Core Identity verwendet werden.However, a cookie-based authentication provider without ASP.NET Core Identity can be used. Weitere Informationen finden Sie unter Einführung in Identity ASP.net Core.For more information, see Einführung in Identity ASP.net Core.

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

Zu Demonstrationszwecken in der Beispiel-APP ist das Benutzerkonto für den hypothetischen Benutzer Maria Rodriguez in der APP hart codiert.For demonstration purposes in the sample app, the user account for the hypothetical user, Maria Rodriguez, is hardcoded into the app. Verwenden Sie die e-Mail- Adresse maria.rodriguez@contoso.com und jedes Kennwort, um den Benutzer anzumelden.Use the Email address maria.rodriguez@contoso.com and any password to sign in the user. Der Benutzer wird in der AuthenticateUser -Methode in der Datei pages/Account/Login. cshtml. cs authentifiziert.The user is authenticated in the AuthenticateUser method in the Pages/Account/Login.cshtml.cs file. In einem realen Beispiel wird der Benutzer für eine-Datenbank authentifiziert.In a real-world example, the user would be authenticated against a database.

KonfigurationConfiguration

Wenn die APP das Metapaket Microsoft. aspnetcore. appnicht verwendet, erstellen Sie einen Paket Verweis in der Projektdatei für die Datei Microsoft. aspnetcore. Authentication. Cookie s -Paket.If the app doesn't use the Microsoft.AspNetCore.App metapackage, create a package reference in the project file for the Microsoft.AspNetCore.Authentication.Cookies package.

Erstellen Sie in der Startup.ConfigureServices -Methode den Authentifizierungs-Middleware-Dienst mit den AddAuthentication AddCookie Methoden und:In the Startup.ConfigureServices method, create the Authentication Middleware service with the AddAuthentication and AddCookie methods:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

AuthenticationScheme wird an AddAuthentication das Standard Authentifizierungsschema für die APP festgelegt.AuthenticationScheme passed to AddAuthentication sets the default authentication scheme for the app. AuthenticationScheme ist nützlich, wenn mehrere Instanzen der Authentifizierung vorhanden sind cookie und Sie die Autorisierung mit einem bestimmten Schema durchlaufen möchten.AuthenticationScheme is useful when there are multiple instances of cookie authentication and you want to authorize with a specific scheme. Durch Festlegen AuthenticationScheme von auf Cookie authenticationdefaults. authenticationScheme wird der Wert " Cookie s" für das Schema bereitstellt.Setting the AuthenticationScheme to CookieAuthenticationDefaults.AuthenticationScheme provides a value of "Cookies" for the scheme. Sie können einen beliebigen Zeichen folgen Wert angeben, der das Schema unterscheidet.You can supply any string value that distinguishes the scheme.

Das Authentifizierungsschema der APP unterscheidet sich vom cookie Authentifizierungsschema der app.The app's authentication scheme is different from the app's cookie authentication scheme. Wenn kein cookie Authentifizierungsschema für bereitgestellt AddCookie wird, verwendet es CookieAuthenticationDefaults.AuthenticationScheme (" Cookie s").When a cookie authentication scheme isn't provided to AddCookie, it uses CookieAuthenticationDefaults.AuthenticationScheme ("Cookies").

Die cookie -Eigenschaft der Authentifizierung IsEssential ist standardmäßig auf festgelegt true .The authentication cookie's IsEssential property is set to true by default. Authentifizierungs- cookie e sind zulässig, wenn ein Website Besucher der Datensammlung nicht zugestimmt hat.Authentication cookies are allowed when a site visitor hasn't consented to data collection. Weitere Informationen finden Sie unter Unterstützung für Datenschutz-Grundverordnung (dsgvo) in ASP.net Core.For more information, see Unterstützung für Datenschutz-Grundverordnung (dsgvo) in ASP.net Core.

Rufen Sie in der- Startup.Configure Methode die- UseAuthentication Methode auf, um die Authentifizierungs Middleware aufzurufen, die die- HttpContext.User Eigenschaft festlegt.In the Startup.Configure method, call the UseAuthentication method to invoke the Authentication Middleware that sets the HttpContext.User property. Rufen Sie die-Methode auf, UseAuthentication bevor Sie UseMvcWithDefaultRoute oder aufrufen UseMvc :Call the UseAuthentication method before calling UseMvcWithDefaultRoute or UseMvc:

app.UseAuthentication();

Die- CookieAuthenticationOptions Klasse wird verwendet, um die Authentifizierungs Anbieter Optionen zu konfigurieren.The CookieAuthenticationOptions class is used to configure the authentication provider options.

Legen Sie CookieAuthenticationOptions in der Dienst Konfiguration für die Authentifizierung in der- Startup.ConfigureServices Methode fest:Set CookieAuthenticationOptions in the service configuration for authentication in the Startup.ConfigureServices method:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        ...
    });

Cookie Richtlinien MiddlewareCookie Policy Middleware

Die Cookie Richtlinien Middleware ermöglicht cookie Richtlinien Funktionen.Cookie Policy Middleware enables cookie policy capabilities. Beim Hinzufügen der Middleware zur APP-Verarbeitungs Pipeline ist die Reihenfolge vertraulich, dass — Sie nur die in der Pipeline registrierten Downstreamkomponenten betrifft.Adding the middleware to the app processing pipeline is order sensitive—it only affects downstream components registered in the pipeline.

app.UseCookiePolicy(cookiePolicyOptions);

Verwenden CookiePolicyOptions Sie für die Cookie Richtlinien Middleware, um globale Merkmale der Verarbeitung zu steuern, cookie und schließen Sie cookie Verarbeitungs Handler ein, wenn e angefügt cookie oder gelöscht werden.Use CookiePolicyOptions provided to the Cookie Policy Middleware to control global characteristics of cookie processing and hook into cookie processing handlers when cookies are appended or deleted.

Der Standard MinimumSameSitePolicy Wert ist SameSiteMode.Lax , um die OAuth2-Authentifizierung zuzulassen.The default MinimumSameSitePolicy value is SameSiteMode.Lax to permit OAuth2 authentication. Um eine Richtlinie für denselben Standort von streng zu erzwingen SameSiteMode.Strict , legen Sie den fest MinimumSameSitePolicy .To strictly enforce a same-site policy of SameSiteMode.Strict, set the MinimumSameSitePolicy. Obwohl diese Einstellung OAuth2 und andere Ursprungs übergreifende Authentifizierungs Schemas unterbricht, erhöht Sie die Sicherheitsstufe cookie für andere Typen von apps, die sich nicht auf die Verarbeitung von Ursprungs übergreifenden Anforderungen stützen.Although this setting breaks OAuth2 and other cross-origin authentication schemes, it elevates the level of cookie security for other types of apps that don't rely on cross-origin request processing.

var cookiePolicyOptions = new CookiePolicyOptions
{
    MinimumSameSitePolicy = SameSiteMode.Strict,
};

Die Cookie Einstellung der Richtlinien Middleware für MinimumSameSitePolicy kann die Einstellung von Cookie.SameSite in den CookieAuthenticationOptions Einstellungen entsprechend der folgenden Matrix beeinflussen.The Cookie Policy Middleware setting for MinimumSameSitePolicy can affect the setting of Cookie.SameSite in CookieAuthenticationOptions settings according to the matrix below.

MinimumsamesitepolicyMinimumSameSitePolicy Cookie. SameSiteCookie.SameSite Ergebnis Cookie . SameSite-EinstellungResultant Cookie.SameSite setting
Samesitemode. NoneSameSiteMode.None Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. LaxSameSiteMode.Lax Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict Samesitemode. NoneSameSiteMode.None
Samesitemode. LaxSameSiteMode.Lax
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict
Samesitemode. StrictSameSiteMode.Strict

Erstellen einer Authentifizierung cookieCreate an authentication cookie

Erstellen Sie eine, um eine zu erstellen cookie , die Benutzerinformationen enthält ClaimsPrincipal .To create a cookie holding user information, construct a ClaimsPrincipal. Die Benutzerinformationen werden serialisiert und in gespeichert cookie .The user information is serialized and stored in the cookie.

Erstellen ClaimsIdentity Sie mit allen erforderlichen Claim s, und rufen SignInAsync Sie auf, um den Benutzer anzumelden:Create a ClaimsIdentity with any required Claims and call SignInAsync to sign in the user:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("FullName", user.FullName),
    new Claim(ClaimTypes.Role, "Administrator"),
};

var claimsIdentity = new ClaimsIdentity(
    claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
    //AllowRefresh = <bool>,
    // Refreshing the authentication session should be allowed.

    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
    // The time at which the authentication ticket expires. A 
    // value set here overrides the ExpireTimeSpan option of 
    // CookieAuthenticationOptions set with AddCookie.

    //IsPersistent = true,
    // Whether the authentication session is persisted across 
    // multiple requests. When used with cookies, controls
    // whether the cookie's lifetime is absolute (matching the
    // lifetime of the authentication ticket) or session-based.

    //IssuedUtc = <DateTimeOffset>,
    // The time at which the authentication ticket was issued.

    //RedirectUri = <string>
    // The full path or absolute URI to be used as an http 
    // redirect response value.
};

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity), 
    authProperties);

SignInAsync erstellt eine verschlüsselte cookie und fügt Sie der aktuellen Antwort hinzu.SignInAsync creates an encrypted cookie and adds it to the current response. Wenn AuthenticationScheme nicht angegeben ist, wird das Standardschema verwendet.If AuthenticationScheme isn't specified, the default scheme is used.

ASP.net Core- Datenschutz System wird für die Verschlüsselung verwendet.ASP.NET Core's Data Protection system is used for encryption. Konfigurieren Sie für eine APP, die auf mehreren Computern gehostet wird, den Lastenausgleich über apps oder eine Webfarm, den Datenschutz so, dass derselbe Schlüsselbund und der APP-Bezeichner verwendet werden.For an app hosted on multiple machines, load balancing across apps, or using a web farm, configure data protection to use the same key ring and app identifier.

AbmeldenSign out

Um den aktuellen Benutzer zu abmelden und dessen zu löschen, wenden Sie Folgendes an cookie SignOutAsync :To sign out the current user and delete their cookie, call SignOutAsync:

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Wenn CookieAuthenticationDefaults.AuthenticationScheme (oder " Cookie s") nicht als Schema verwendet wird (z. b. "Configuration Manager" Cookie ), geben Sie das Schema an, das beim Konfigurieren des Authentifizierungs Anbieters verwendet wird.If CookieAuthenticationDefaults.AuthenticationScheme (or "Cookies") isn't used as the scheme (for example, "ContosoCookie"), supply the scheme used when configuring the authentication provider. Andernfalls wird das Standardschema verwendet.Otherwise, the default scheme is used.

Reagieren auf Back-End-ÄnderungenReact to back-end changes

Nachdem ein cookie erstellt wurde, cookie ist die einzige Quelle der Identität.Once a cookie is created, the cookie is the single source of identity. Wenn ein Benutzerkonto in Back-End-Systemen deaktiviert ist:If a user account is disabled in back-end systems:

  • Das cookie Authentifizierungssystem der APP verarbeitet weiterhin Anforderungen auf der Grundlage der Authentifizierung cookie .The app's cookie authentication system continues to process requests based on the authentication cookie.
  • Der Benutzer bleibt bei der App angemeldet, solange die Authentifizierung cookie gültig ist.The user remains signed into the app as long as the authentication cookie is valid.

Das ValidatePrincipal -Ereignis kann verwendet werden, um die Validierung der Identität abzufangen und zu überschreiben cookie .The ValidatePrincipal event can be used to intercept and override validation of the cookie identity. Das Überprüfen von cookie bei jeder Anforderung verringert das Risiko, dass widerrufene Benutzer auf die App zugreifen.Validating the cookie on every request mitigates the risk of revoked users accessing the app.

Ein Ansatz zur cookie Validierung basiert auf der Verfolgung, wann die Benutzerdatenbank geändert wird.One approach to cookie validation is based on keeping track of when the user database changes. Wenn die Datenbank nicht geändert wurde, seit Sie cookie ausgestellt wurde, ist es nicht erforderlich, den Benutzer erneut zu authentifizieren, wenn der Benutzer cookie noch gültig ist.If the database hasn't been changed since the user's cookie was issued, there's no need to re-authenticate the user if their cookie is still valid. In der Beispiel-APP wird die Datenbank in implementiert IUserRepository und speichert einen LastChanged Wert.In the sample app, the database is implemented in IUserRepository and stores a LastChanged value. Wenn ein Benutzer in der Datenbank aktualisiert wird, LastChanged wird der Wert auf die aktuelle Zeit festgelegt.When a user is updated in the database, the LastChanged value is set to the current time.

Um eine für ungültig zu erklären cookie , wenn sich die Datenbank auf der Grundlage des- LastChanged Werts ändert, erstellen Sie cookie mit einem Anspruch, der LastChanged den aktuellen LastChanged Wert aus der Datenbank enthält:In order to invalidate a cookie when the database changes based on the LastChanged value, create the cookie with a LastChanged claim containing the current LastChanged value from the database:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.Email),
    new Claim("LastChanged", {Database Value})
};

var claimsIdentity = new ClaimsIdentity(
    claims, 
    CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme, 
    new ClaimsPrincipal(claimsIdentity));

Um eine außer Kraft setzung für das-Ereignis zu implementieren ValidatePrincipal , schreiben Sie eine-Methode mit der folgenden Signatur in eine Klasse, die von abgeleitet ist CookieAuthenticationEvents :To implement an override for the ValidatePrincipal event, write a method with the following signature in a class that derives from CookieAuthenticationEvents:

ValidatePrincipal(CookieValidatePrincipalContext)

Im folgenden finden Sie eine Beispiel Implementierung von CookieAuthenticationEvents :The following is an example implementation of CookieAuthenticationEvents:

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        // Get the database from registered DI services.
        _userRepository = userRepository;
    }

    public override async Task ValidatePrincipal(CookieValidatePrincipalContext context)
    {
        var userPrincipal = context.Principal;

        // Look for the LastChanged claim.
        var lastChanged = (from c in userPrincipal.Claims
                           where c.Type == "LastChanged"
                           select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !_userRepository.ValidateLastChanged(lastChanged))
        {
            context.RejectPrincipal();

            await context.HttpContext.SignOutAsync(
                CookieAuthenticationDefaults.AuthenticationScheme);
        }
    }
}

Registrieren Sie die Ereignis Instanz während cookie der Dienst Registrierung in der- Startup.ConfigureServices Methode.Register the events instance during cookie service registration in the Startup.ConfigureServices method. Stellen Sie eine Bereichs bezogene Dienst Registrierung für die CustomCookieAuthenticationEvents Klasse bereit:Provide a scoped service registration for your CustomCookieAuthenticationEvents class:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.EventsType = typeof(CustomCookieAuthenticationEvents);
    });

services.AddScoped<CustomCookieAuthenticationEvents>();

Stellen Sie sich eine Situation vor, in der der Name des Benutzers — eine Entscheidung aktualisiert, die die Sicherheit in keiner Weise beeinträchtigt.Consider a situation in which the user's name is updated—a decision that doesn't affect security in any way. Wenn Sie den Benutzer Prinzipal nicht dedestruktiv aktualisieren möchten, müssen Sie aufrufen context.ReplacePrincipal und die- context.ShouldRenew Eigenschaft auf festlegen true .If you want to non-destructively update the user principal, call context.ReplacePrincipal and set the context.ShouldRenew property to true.

Warnung

Der hier beschriebene Ansatz wird bei jeder Anforderung ausgelöst.The approach described here is triggered on every request. cookieDas Überprüfen der Authentifizierungs-e für alle Benutzer bei jeder Anforderung kann zu einer hohen Leistungs Einbuße für die APP führen.Validating authentication cookies for all users on every request can result in a large performance penalty for the app.

Persistente cookie sPersistent cookies

Es kann sein, dass die cookie über Browsersitzungen hinweg beibehalten werden soll.You may want the cookie to persist across browser sessions. Diese Persistenz sollte nur mit der expliziten Zustimmung des Benutzers mit dem Kontrollkästchen "merken" bei der Anmeldung oder einem ähnlichen Mechanismus aktiviert werden.This persistence should only be enabled with explicit user consent with a "Remember Me" check box on sign in or a similar mechanism.

Mit dem folgenden Code Ausschnitt werden eine Identität und eine entsprechende Identität erstellt cookie , die bei Browser Abschlüssen nicht angezeigt wird.The following code snippet creates an identity and corresponding cookie that survives through browser closures. Alle zuvor konfigurierten gleitenden Ablauf Einstellungen werden berücksichtigt.Any sliding expiration settings previously configured are honored. Wenn das cookie abläuft, während der Browser geschlossen wird, löscht der Browser den, cookie nachdem er neu gestartet wurde.If the cookie expires while the browser is closed, the browser clears the cookie once it's restarted.

IsPersistentAuf true in festlegen AuthenticationProperties :Set IsPersistent to true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true
    });

Absoluter cookie AblaufAbsolute cookie expiration

Eine absolute Ablaufzeit kann mit festgelegt werden ExpiresUtc .An absolute expiration time can be set with ExpiresUtc. Zum Erstellen eines persistenten cookie IsPersistent muss ebenfalls festgelegt werden.To create a persistent cookie, IsPersistent must also be set. Andernfalls wird das cookie mit einer Sitzungs basierten Lebensdauer erstellt und kann entweder vor oder nach dem Authentifizierungs Ticket ablaufen, das es enthält.Otherwise, the cookie is created with a session-based lifetime and could expire either before or after the authentication ticket that it holds. Wenn ExpiresUtc festgelegt ist, wird der Wert der- ExpireTimeSpan Option von CookieAuthenticationOptions , sofern festgelegt, überschrieben.When ExpiresUtc is set, it overrides the value of the ExpireTimeSpan option of CookieAuthenticationOptions, if set.

Der folgende Code Ausschnitt erstellt eine Identität und entsprechende cookie , die 20 Minuten dauert.The following code snippet creates an identity and corresponding cookie that lasts for 20 minutes. Dadurch werden alle zuvor konfigurierten gleitenden Ablauf Einstellungen ignoriert.This ignores any sliding expiration settings previously configured.

// using Microsoft.AspNetCore.Authentication;

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        IsPersistent = true,
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
    });

Zusätzliche RessourcenAdditional resources