Delen via


Verificatie gebruiken cookie zonder ASP.NET Core Identity

Door Rick Anderson

ASP.NET Core Identity is een volledige, volledige verificatieprovider voor het maken en onderhouden van aanmeldingen. Een op cookie-gebaseerde authenticatieprovider kan echter zonder ASP.NET Core Identity worden gebruikt. Zie Inleiding tot Identity ASP.NET Core voor meer informatie.

Voorbeeldcode bekijken of downloaden (hoe download je)

Voor demonstratiedoeleinden in de voorbeeld-app wordt het gebruikersaccount voor de hypothetische gebruiker Maria Rodriguez vastgelegd in de app. Gebruik het e-mailadresmaria.rodriguez@contoso.com en een wachtwoord om u aan te melden bij de gebruiker. De gebruiker wordt geauthentiseerd in de AuthenticateUser methode in het Pages/Account/Login.cshtml.cs bestand. In een praktijkvoorbeeld zou de gebruiker geauthenticeerd worden tegen een datastore.

Belangrijk

Vanaf ASP.NET Core 10 worden bekende API-eindpunten niet meer omgeleid naar aanmeldingspagina's bij het gebruik van cookie verificatie. In plaats daarvan retourneren ze 401/403-statuscodes. Zie het gedrag voor API-eindpuntverificatie in ASP.NET Core voor meer informatie.

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

builder.Services.AddHttpContextAccessor();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

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

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

AuthenticationScheme wordt doorgegeven aan AddAuthentication om het standaardverificatieschema voor de app in te stellen. AuthenticationScheme is handig wanneer er meerdere verificatieexemplaren cookie zijn en de app moet autoriseren met een specifiek schema. Het instellen van AuthenticationScheme op CookieAuthenticationDefaults.AuthenticationScheme zorgt voor een waarde van "Cookies" voor het schema. Elke tekenreekswaarde kan worden gebruikt om het schema te onderscheiden.

Als CookieAuthenticationDefaults.AuthenticationScheme (standaardwaarde: "Cookies") niet wordt gebruikt als het schema, geeft u het schema op dat wordt gebruikt bij het configureren van de verificatieprovider. Anders wordt het standaardschema gebruikt. Als bijvoorbeeld 'ContosoCookie' als het schema wordt gebruikt, geeft u het schema op dat wordt gebruikt bij het configureren van de verificatieprovider.

De eigenschap van de authenticatie cookie is standaard ingesteld op IsEssential. Verificatiecookies zijn toegestaan wanneer een sitebezoeker geen toestemming heeft gegeven voor het verzamelen van gegevens. Zie De ondersteuning voor algemene verordening gegevensbescherming (AVG) in ASP.NET Core voor meer informatie.

De CookieAuthenticationOptions klasse wordt gebruikt om de opties van de verificatieprovider te configureren.

Configureer CookieAuthenticationOptions in de AddCookie methode:

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
        options.SlidingExpiration = true;
        options.AccessDeniedPath = "/Forbidden/";
    });

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

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

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

De Cookie Policy Middleware (GitHub Source)UseCookiePolicy maakt beleidsmogelijkheden mogelijk cookie . Middleware wordt verwerkt in de volgorde waarin deze wordt toegevoegd en Cookie Policy Middleware moet worden toegevoegd voordat cookie verificatie-middleware wordt gebruikt.

Gebruik CookiePolicyOptions dat wordt verstrekt aan de Cookie Policy Middleware om globale kenmerken van cookie verwerking te beheren en te koppelen aan cookie verwerkingshandlers wanneer cookies worden toegevoegd of verwijderd.

De standaardwaarde MinimumSameSitePolicy is SameSiteMode.Lax om OAuth2-verificatie toe te staan. Als u strikt een beleid op dezelfde site van SameSiteMode.Strictwilt afdwingen, stelt u de MinimumSameSitePolicyoptie in. Hoewel deze instelling OAuth2 en andere cross-origin-verificatieschema's onderbreekt, wordt het beveiligingsniveau cookie voor andere typen apps die niet afhankelijk zijn van verwerking van cross-origin-aanvragen verhogen.

In het volgende voorbeeld ziet u hoe u verificatie configureert cookie met Cookie Policy Middleware:

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

app.UseCookiePolicy(cookiePolicyOptions);

De Cookie Policy Middleware-instelling voor MinimumSameSitePolicy kan de instelling van Cookie.SameSite in CookieAuthenticationOptions-instellingen beïnvloeden volgens de onderstaande matrix.

MinimumSameSitePolicy Cookie. SameSite Resulterende Cookie SameSite-instelling
SameSiteMode.None SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict

Om een cookie met gebruikersinformatie te maken, maakt u een ClaimsPrincipal. De gebruikersgegevens worden geserialiseerd en opgeslagen in de cookie.

Maak een ClaimsIdentity met de vereiste Claims en roep SignInAsync aan om de gebruiker aan te melden. Login.cshtml.cs in de voorbeeld-app bevat de volgende code:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    ReturnUrl = returnUrl;

    if (ModelState.IsValid)
    {
        // Use Input.Email and Input.Password to authenticate the user
        // with your custom authentication logic.
        //
        // For demonstration purposes, the sample validates the user
        // on the email address maria.rodriguez@contoso.com with 
        // any password that passes model validation.

        var user = await AuthenticateUser(Input.Email, Input.Password);

        if (user == null)
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }

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

        _logger.LogInformation("User {Email} logged in at {Time}.", 
            user.Email, DateTime.UtcNow);

        return LocalRedirect(Url.GetLocalUrl(returnUrl));
    }

    // Something failed. Redisplay the form.
    return Page();
}

Als u codeopmerkingen wilt zien die zijn vertaald naar andere talen dan Engels, laat het ons dan weten in dit GitHub-discussieprobleem.

SignInAsync maakt een versleutelde cookie en voegt deze toe aan het huidige antwoord. Als AuthenticationScheme niet is opgegeven, wordt het standaardschema gebruikt.

RedirectUri wordt standaard alleen gebruikt op enkele specifieke paden, bijvoorbeeld het aanmeldingspad en afmeldingspaden. Zie de CookieAuthenticationHandler-bron voor meer informatie.

ASP.NET Core's Data Protection-systeem wordt gebruikt voor versleuteling. Voor een app die wordt gehost op meerdere computers, taakverdeling tussen apps of met behulp van een webfarm, configureert u gegevensbeveiliging om dezelfde sleutelring en app-id te gebruiken.

Afmelden

Als u de huidige gebruiker wilt afmelden en hun cookie wilt verwijderen, gebruik dan de volgende functie: SignOutAsync.

public async Task OnGetAsync(string returnUrl = null)
{
    if (!string.IsNullOrEmpty(ErrorMessage))
    {
        ModelState.AddModelError(string.Empty, ErrorMessage);
    }

    // Clear the existing external cookie
    await HttpContext.SignOutAsync(
        CookieAuthenticationDefaults.AuthenticationScheme);

    ReturnUrl = returnUrl;
}

Als CookieAuthenticationDefaults.AuthenticationScheme (standaardwaarde: "Cookies") niet wordt gebruikt als het schema, geeft u het schema op dat wordt gebruikt bij het configureren van de verificatieprovider. Anders wordt het standaardschema gebruikt. Als bijvoorbeeld 'ContosoCookie' als het schema wordt gebruikt, geeft u het schema op dat wordt gebruikt bij het configureren van de verificatieprovider.

Wanneer de browser wordt gesloten, worden sessiegebaseerde cookies (niet-permanente cookies) automatisch verwijderd, maar worden er geen cookies gewist wanneer een afzonderlijk tabblad wordt gesloten. De server wordt niet op de hoogte gesteld van het sluiten van tabbladen of browsers.

Reageren op back-endwijzigingen

Zodra een cookie is gemaakt, is dit cookie de enige bron van identiteit. Als een gebruikersaccount is uitgeschakeld in back-endsystemen:

  • Het verificatiesysteem van cookie de app blijft aanvragen verwerken op basis van de verificatie cookie.
  • De gebruiker blijft aangemeld bij de app zolang de verificatie cookie geldig is.

De ValidatePrincipal gebeurtenis kan worden gebruikt om validatie van de cookie identiteit te onderscheppen en overschrijven. Door de cookie bij elk verzoek te valideren, wordt het risico beperkt dat ingetrokken gebruikers toegang krijgen tot de app.

Eén methode voor cookie validatie is gebaseerd op het bijhouden van wanneer de gebruikersdatabase wordt gewijzigd. Als de database niet is gewijzigd sinds de cookie aan de gebruiker is uitgegeven, hoeft u de gebruiker niet opnieuw te verifiëren als hun cookie nog geldig is. In de voorbeeld-app wordt de database in IUserRepository geïmplementeerd en slaat het een LastChanged waarde op. Wanneer een gebruiker wordt bijgewerkt in de database, wordt de LastChanged waarde ingesteld op de huidige tijd.

Als u een cookie ongeldige waarde wilt maken wanneer de database wordt gewijzigd op basis van de LastChanged waarde, maakt u de cookie met een LastChanged claim die de huidige LastChanged waarde uit de database bevat:

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

Als u een override voor de ValidatePrincipal gebeurtenis wilt implementeren, schrijft u een methode met de volgende signatuur in een klasse die is afgeleid van CookieAuthenticationEvents:

ValidatePrincipal(CookieValidatePrincipalContext)

Hier volgt een voorbeeld van CookieAuthenticationEvents:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;

public class CustomCookieAuthenticationEvents : CookieAuthenticationEvents
{
    private readonly IUserRepository _userRepository;

    public CustomCookieAuthenticationEvents(IUserRepository userRepository)
    {
        _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);
        }
    }
}

Registreer de gebeurtenisinstantie tijdens cookie de serviceregistratie. Geef een bereikserviceregistratie op voor uw CustomCookieAuthenticationEvents klasse:

using Microsoft.AspNetCore.Authentication.Cookies;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

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

builder.Services.AddScoped<CustomCookieAuthenticationEvents>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

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

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

Overweeg een situatie waarin de naam van de gebruiker wordt bijgewerkt: een beslissing die geen invloed heeft op de beveiliging. Als u de gebruikersprincipaal niet destructief wilt bijwerken, roept u context.ReplacePrincipal aan en stelt de eigenschap context.ShouldRenew in op true.

Warning

De hier beschreven benadering wordt bij elke aanvraag geactiveerd. Het valideren van verificatiecookies voor alle gebruikers op elke aanvraag kan leiden tot een grote prestatiestraf voor de app.

Permanente cookies

Mogelijk wilt u dat de cookie behouden blijft gedurende verschillende browsersessies. Deze persistentie mag alleen worden ingeschakeld met expliciete gebruikerstoestemming met het selectievakje 'Mij onthouden' bij aanmelding of een vergelijkbaar mechanisme.

nl-NL: Met het volgende codefragment wordt een identiteit en een bijbehorende cookie gecreëerd die blijft bestaan, zelfs wanneer de browser wordt gesloten. Eventuele eerder geconfigureerde instellingen voor verschuivende vervaldatums worden gehonoreerd. Als de cookie browser verloopt terwijl de browser is gesloten, wordt de cookie browser gewist zodra deze opnieuw is opgestart.

Ingesteld IsPersistent op true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

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

Een absolute verlooptijd kan worden ingesteld met ExpiresUtc. Als u een permanent bestand cookiewilt maken, IsPersistent moet u ook instellen. Anders wordt het cookie gemaakt met een op een sessie gebaseerde levensduur en kan deze verlopen vóór of na het verificatieticket dat het bevat. Wanneer ExpiresUtc is ingesteld, wordt de waarde van de ExpireTimeSpan-optie van CookieAuthenticationOptions, indien ingesteld, overschreven.

Met het volgende codefragment maakt u een identiteit en de bijbehorende cookie die 20 minuten geldig blijft. Hiermee worden eventuele instellingen voor verschuivende verlooptijd genegeerd die eerder zijn geconfigureerd.

// 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 is een volledige, volledige verificatieprovider voor het maken en onderhouden van aanmeldingen. Een op cookie-gebaseerde authenticatieprovider kan echter zonder ASP.NET Core Identity worden gebruikt. Zie Inleiding tot Identity ASP.NET Core voor meer informatie.

Voorbeeldcode bekijken of downloaden (hoe download je)

Voor demonstratiedoeleinden in de voorbeeld-app wordt het gebruikersaccount voor de hypothetische gebruiker Maria Rodriguez vastgelegd in de app. Gebruik het e-mailadresmaria.rodriguez@contoso.com en een wachtwoord om u aan te melden bij de gebruiker. De gebruiker wordt geauthentiseerd in de AuthenticateUser methode in het Pages/Account/Login.cshtml.cs bestand. In een praktijkvoorbeeld wordt de gebruiker geverifieerd voor een database.

Configuration

Maak in de Startup.ConfigureServices methode de Verificatie-Middleware-services met de AddAuthentication en AddCookie methoden:

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

AuthenticationScheme wordt doorgegeven aan AddAuthentication om het standaardverificatieschema voor de app in te stellen. AuthenticationScheme is handig wanneer er meerdere verificatieexemplaren cookie zijn en u wilt autoriseren met een specifiek schema. Het instellen van AuthenticationScheme op CookieAuthenticationDefaults.AuthenticationScheme geeft de waarde "Cookies" aan het schema. U kunt elke tekenreekswaarde opgeven waarmee het schema wordt onderscheiden.

Het verificatieschema van de app verschilt van het verificatieschema van cookie de app. Wanneer cookie er geen verificatieschema wordt verstrekt aan AddCookie, wordt CookieAuthenticationDefaults.AuthenticationScheme ("Cookies") gebruikt.

De eigenschap van de authenticatie cookie is standaard ingesteld op IsEssential. Verificatiecookies zijn toegestaan wanneer een sitebezoeker geen toestemming heeft gegeven voor het verzamelen van gegevens. Zie De ondersteuning voor algemene verordening gegevensbescherming (AVG) in ASP.NET Core voor meer informatie.

In Startup.Configure, roep UseAuthentication en UseAuthorization aan om de HttpContext.User-eigenschap in te stellen en voer Authorization Middleware uit voor de aanvragen. Roep de UseAuthentication en UseAuthorization methoden aan voordat u aanroept UseEndpoints:

De CookieAuthenticationOptions klasse wordt gebruikt om de opties van de verificatieprovider te configureren.

Instellen CookieAuthenticationOptions in de serviceconfiguratie voor verificatie in de Startup.ConfigureServices methode:

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

Cookie Policy Middleware maakt beleidsmogelijkheden mogelijk cookie . Het toevoegen van de middleware aan de pijplijn voor app-verwerking is ordergevoelig. Dit is alleen van invloed op downstreamonderdelen die zijn geregistreerd in de pijplijn en Cookie Policy Middleware moet worden toegevoegd voordat cookie verificatie-middleware wordt gebruikt.

Gebruik CookiePolicyOptions dat wordt verstrekt aan de Cookie Policy Middleware om globale kenmerken van cookie verwerking te beheren en te koppelen aan cookie verwerkingshandlers wanneer cookies worden toegevoegd of verwijderd.

De standaardwaarde MinimumSameSitePolicy is SameSiteMode.Lax om OAuth2-verificatie toe te staan. Als u strikt een beleid op dezelfde site van SameSiteMode.Strictwilt afdwingen, stelt u de MinimumSameSitePolicyoptie in. Hoewel deze instelling OAuth2 en andere cross-origin-verificatieschema's onderbreekt, wordt het beveiligingsniveau cookie voor andere typen apps die niet afhankelijk zijn van verwerking van cross-origin-aanvragen verhogen.

In het volgende voorbeeld ziet u hoe u verificatie configureert cookie met Cookie Policy Middleware:

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

app.UseCookiePolicy(cookiePolicyOptions);

De Cookie Policy Middleware-instelling voor MinimumSameSitePolicy kan de instelling van Cookie.SameSite in CookieAuthenticationOptions-instellingen beïnvloeden volgens de onderstaande matrix.

MinimumSameSitePolicy Cookie. SameSite Resulterende Cookie SameSite-instelling
SameSiteMode.None SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Lax
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict SameSiteMode.None
SameSiteMode.Lax
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict
SameSiteMode.Strict

Om een cookie met gebruikersinformatie te maken, maakt u een ClaimsPrincipal. De gebruikersgegevens worden geserialiseerd en opgeslagen in de cookie.

Maak een ClaimsIdentity met de vereiste Claims en roep SignInAsync aan om de gebruiker aan te melden.

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

Als u codeopmerkingen wilt zien die zijn vertaald naar andere talen dan Engels, laat het ons dan weten in dit GitHub-discussieprobleem.

SignInAsync maakt een versleutelde cookie en voegt deze toe aan het huidige antwoord. Als AuthenticationScheme niet is opgegeven, wordt het standaardschema gebruikt.

RedirectUri wordt standaard alleen gebruikt op enkele specifieke paden, bijvoorbeeld het aanmeldingspad en afmeldingspaden. Zie de CookieAuthenticationHandler-bron voor meer informatie.

ASP.NET Core's Data Protection-systeem wordt gebruikt voor versleuteling. Voor een app die wordt gehost op meerdere computers, taakverdeling tussen apps of met behulp van een webfarm, configureert u gegevensbeveiliging om dezelfde sleutelring en app-id te gebruiken.

Afmelden

Als u de huidige gebruiker wilt afmelden en hun cookie wilt verwijderen, gebruik dan de volgende functie: SignOutAsync.

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Als CookieAuthenticationDefaults.AuthenticationScheme (standaardwaarde: "Cookies") niet wordt gebruikt als het schema, geeft u het schema op dat wordt gebruikt bij het configureren van de verificatieprovider. Anders wordt het standaardschema gebruikt. Als bijvoorbeeld 'ContosoCookie' als het schema wordt gebruikt, geeft u het schema op dat wordt gebruikt bij het configureren van de verificatieprovider.

Wanneer de browser wordt gesloten, worden sessiegebaseerde cookies (niet-permanente cookies) automatisch verwijderd, maar worden er geen cookies gewist wanneer een afzonderlijk tabblad wordt gesloten. De server wordt niet op de hoogte gesteld van het sluiten van tabbladen of browsers.

Reageren op back-endwijzigingen

Zodra een cookie is gemaakt, is dit cookie de enige bron van identiteit. Als een gebruikersaccount is uitgeschakeld in back-endsystemen:

  • Het verificatiesysteem van cookie de app blijft aanvragen verwerken op basis van de verificatie cookie.
  • De gebruiker blijft aangemeld bij de app zolang de verificatie cookie geldig is.

De ValidatePrincipal gebeurtenis kan worden gebruikt om validatie van de cookie identiteit te onderscheppen en overschrijven. Door de cookie bij elk verzoek te valideren, wordt het risico beperkt dat ingetrokken gebruikers toegang krijgen tot de app.

Eén methode voor cookie validatie is gebaseerd op het bijhouden van wanneer de gebruikersdatabase wordt gewijzigd. Als de database niet is gewijzigd sinds de cookie aan de gebruiker is uitgegeven, hoeft u de gebruiker niet opnieuw te verifiëren als hun cookie nog geldig is. In de voorbeeld-app wordt de database in IUserRepository geïmplementeerd en slaat het een LastChanged waarde op. Wanneer een gebruiker wordt bijgewerkt in de database, wordt de LastChanged waarde ingesteld op de huidige tijd.

Als u een cookie ongeldige waarde wilt maken wanneer de database wordt gewijzigd op basis van de LastChanged waarde, maakt u de cookie met een LastChanged claim die de huidige LastChanged waarde uit de database bevat:

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

Als u een override voor de ValidatePrincipal gebeurtenis wilt implementeren, schrijft u een methode met de volgende signatuur in een klasse die is afgeleid van CookieAuthenticationEvents:

ValidatePrincipal(CookieValidatePrincipalContext)

Hier volgt een voorbeeld van 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);
        }
    }
}

Registreer de gebeurtenisinstanties tijdens de cookie serviceregistratie in de Startup.ConfigureServices methode. Geef een bereikserviceregistratie op voor uw CustomCookieAuthenticationEvents klasse:

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

services.AddScoped<CustomCookieAuthenticationEvents>();

Overweeg een situatie waarin de naam van de gebruiker wordt bijgewerkt: een beslissing die geen invloed heeft op de beveiliging. Als u de gebruikersprincipaal niet destructief wilt bijwerken, roept u context.ReplacePrincipal aan en stelt de eigenschap context.ShouldRenew in op true.

Warning

De hier beschreven benadering wordt bij elke aanvraag geactiveerd. Het valideren van verificatiecookies voor alle gebruikers op elke aanvraag kan leiden tot een grote prestatiestraf voor de app.

Permanente cookies

Mogelijk wilt u dat de cookie behouden blijft gedurende verschillende browsersessies. Deze persistentie mag alleen worden ingeschakeld met expliciete gebruikerstoestemming met het selectievakje 'Mij onthouden' bij aanmelding of een vergelijkbaar mechanisme.

nl-NL: Met het volgende codefragment wordt een identiteit en een bijbehorende cookie gecreëerd die blijft bestaan, zelfs wanneer de browser wordt gesloten. Eventuele eerder geconfigureerde instellingen voor verschuivende vervaldatums worden gehonoreerd. Als de cookie browser verloopt terwijl de browser is gesloten, wordt de cookie browser gewist zodra deze opnieuw is opgestart.

Ingesteld IsPersistent op true in AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

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

Een absolute verlooptijd kan worden ingesteld met ExpiresUtc. Als u een permanent bestand cookiewilt maken, IsPersistent moet u ook instellen. Anders wordt het cookie gemaakt met een op een sessie gebaseerde levensduur en kan deze verlopen vóór of na het verificatieticket dat het bevat. Wanneer ExpiresUtc is ingesteld, wordt de waarde van de ExpireTimeSpan-optie van CookieAuthenticationOptions, indien ingesteld, overschreven.

Met het volgende codefragment maakt u een identiteit en de bijbehorende cookie die 20 minuten geldig blijft. Hiermee worden eventuele instellingen voor verschuivende verlooptijd genegeerd die eerder zijn geconfigureerd.

// using Microsoft.AspNetCore.Authentication;

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