Używanie cookie uwierzytelniania bez ASP.NET Core Identity

Autor: Rick Anderson

ASP.NET Core Identity to kompletny, w pełni funkcjonalny dostawca uwierzytelniania do tworzenia i obsługi identyfikatorów logowania. Można jednak użyć dostawcy uwierzytelniania opartego cookiena ASP.NET Core Identity . Aby uzyskać więcej informacji, zobacz Wprowadzenie do Identity ASP.NET Core.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

W celach demonstracyjnych w przykładowej aplikacji konto użytkownika hipotetycznego użytkownika Maria Rodriguez jest zakodowane w aplikacji. Użyj adresu maria.rodriguez@contoso.com e-mail i dowolnego hasła, aby zalogować się do użytkownika. Użytkownik jest uwierzytelniany w metodzie AuthenticateUserPages/Account/Login.cshtml.cs w pliku . W rzeczywistym przykładzie użytkownik zostanie uwierzytelniony w magazynie danych.

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 przekazano do AddAuthentication ustawienia domyślnego schematu uwierzytelniania dla aplikacji. AuthenticationScheme jest przydatne, gdy istnieje wiele wystąpień uwierzytelniania, a aplikacja musi autoryzować cookieokreślony schemat. Ustawienie wartościCookie AuthenticationDefaults.AuthenticationScheme AuthenticationScheme zapewnia wartość "Cookies" dla schematu. Można użyć dowolnej wartości ciągu, która odróżnia schemat.

Schemat uwierzytelniania aplikacji różni się od schematu cookie uwierzytelniania aplikacji. cookie Jeśli schemat uwierzytelniania nie jest udostępniany w programie AddCookie, używa elementu CookieAuthenticationDefaults.AuthenticationScheme. Źródło CookieAuthenticationDefaults.AuthenticationScheme usługi GitHub pokazuje, że jest ono ustawione na "Cookies"wartość .

Właściwość uwierzytelniania cookiejest domyślnie ustawiona IsEssential na true wartość . Uwierzytelnianie cookiejest dozwolone, gdy osoba odwiedzająca witrynę nie wyraziła zgody na zbieranie danych. Aby uzyskać więcej informacji, zobacz Ogólne wsparcie dotyczące rozporządzenia o ochronie danych (RODO) w ASP.NET Core.

Klasa CookieAuthenticationOptions służy do konfigurowania opcji dostawcy uwierzytelniania.

Skonfiguruj CookieAuthenticationOptions w metodzie AddCookie :

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

Oprogramowanie Cookie pośredniczące zasad (źródło GitHub)UseCookiePolicy umożliwia cookie korzystanie z zasad. Oprogramowanie pośredniczące jest przetwarzane w kolejności dodawania:

app.UseCookiePolicy(cookiePolicyOptions);

Służy CookiePolicyOptions do oprogramowania pośredniczącego Cookie zasad w celu kontrolowania globalnych cookie cech przetwarzania i przypinania do cookie procedur obsługi przetwarzania, gdy cookiepliki są dołączane lub usuwane.

Wartością domyślną MinimumSameSitePolicy jest SameSiteMode.Lax zezwolenie na uwierzytelnianie OAuth2. Aby ściśle wymusić zasady tej samej lokacji SameSiteMode.Strictprogramu , ustaw wartość MinimumSameSitePolicy. Mimo że to ustawienie powoduje przerwanie uwierzytelniania OAuth2 i innych schematów uwierzytelniania między źródłami, zwiększa poziom cookie zabezpieczeń dla innych typów aplikacji, które nie korzystają z przetwarzania żądań między źródłami.

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

Cookie Ustawienie Oprogramowania pośredniczącego zasad dla programu może mieć wpływ na ustawienie MinimumSameSitePolicyCookie.SameSite ustawień zgodnie CookieAuthenticationOptions z poniższą macierzą.

MinimumSameSitePolicy Cookie. SameSite Wynikowy Cookie. Ustawienie SameSite
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

Aby utworzyć informacje o użytkowniku cookie gospodarstwa, skonstruuj element ClaimsPrincipal. Informacje o użytkowniku są serializowane i przechowywane w pliku cookie.

Utwórz obiekt ClaimsIdentity z dowolnymi wymaganymi Claimelementami i wywołaj SignInAsync polecenie , aby zalogować użytkownika. Login.cshtml.cs w przykładowej aplikacji zawiera następujący kod:

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

Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.

SignInAsync tworzy zaszyfrowany cookie kod i dodaje go do bieżącej odpowiedzi. Jeśli AuthenticationScheme nie zostanie określony, zostanie użyty schemat domyślny.

RedirectUri Jest używany tylko w kilku określonych ścieżkach domyślnie, na przykład ścieżki logowania i wylogowywanie ścieżek. Aby uzyskać więcej informacji, zobacz CookieŹródło programu AuthenticationHandler.

System ochrony danych ASP.NET Core jest używany do szyfrowania. W przypadku aplikacji hostowanej na wielu maszynach równoważenie obciążenia w aplikacjach lub przy użyciu farmy internetowej skonfiguruj ochronę danych tak, aby korzystała z tego samego pierścienia kluczy i identyfikatora aplikacji.

Wyloguj się

Aby wylogować bieżącego użytkownika i usunąć go cookie, wywołaj metodę 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;
}

Jeśli CookieAuthenticationDefaults.AuthenticationScheme lub "Cookies" nie jest używany jako schemat, podaj schemat używany podczas konfigurowania dostawcy uwierzytelniania. W przeciwnym razie jest używany schemat domyślny. Jeśli na przykład "ContosoCookie" jest używany jako schemat, podaj schemat używany podczas konfigurowania dostawcy uwierzytelniania.

Gdy przeglądarka zamknie ją automatycznie usunie s ( cookienietrwałe cookies), ale nie cookiesą czyszczone po zamknięciu pojedynczej karty. Serwer nie jest powiadamiany o zdarzeniach zamknięcia karty lub przeglądarki.

Reagowanie na zmiany zaplecza

Po utworzeniu cookie elementu cookie element jest pojedynczym źródłem tożsamości. Jeśli konto użytkownika jest wyłączone w systemach zaplecza:

  • System uwierzytelniania aplikacji cookie nadal przetwarza żądania na podstawie uwierzytelniania cookie.
  • Użytkownik pozostaje zalogowany do aplikacji, o ile uwierzytelnianie cookie jest prawidłowe.

Zdarzenie ValidatePrincipal może służyć do przechwytywania cookie i zastępowania weryfikacji tożsamości. Weryfikowanie elementu na każdym żądaniu cookie zmniejsza ryzyko odwołanych użytkowników, którzy uzyskują dostęp do aplikacji.

Jednym z podejść do cookie walidacji jest śledzenie zmian bazy danych użytkownika. Jeśli baza danych nie została zmieniona od czasu wydania użytkownika, nie trzeba ponownie uwierzytelniać użytkownika cookie , jeśli jest cookie on nadal prawidłowy. W przykładowej aplikacji baza danych jest implementowana i IUserRepository przechowuje LastChanged wartość. Gdy użytkownik zostanie zaktualizowany w bazie danych, LastChanged wartość zostanie ustawiona na bieżący czas.

Aby unieważnić cookie element, gdy baza danych zmieni się na LastChanged podstawie wartości, utwórz element cookie z oświadczeniem zawierającym LastChanged bieżącą LastChanged wartość z bazy danych:

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

Aby zaimplementować przesłonięcia dla ValidatePrincipal zdarzenia, napisz metodę z następującym podpisem w klasie pochodzącej z CookieAuthenticationEventsklasy :

ValidatePrincipal(CookieValidatePrincipalContext)

Poniżej przedstawiono przykładową implementację elementu 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);
        }
    }
}

Zarejestruj wystąpienie zdarzeń podczas cookie rejestracji usługi. Podaj rejestrację usługi w zakresie dla klasyCustomCookieAuthenticationEvents:

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

Rozważ sytuację, w której nazwa użytkownika jest aktualizowana — decyzja, która nie ma wpływu na bezpieczeństwo w żaden sposób. Jeśli chcesz niedestrukcyjne zaktualizować nazwę główną użytkownika, wywołaj context.ReplacePrincipal i ustaw context.ShouldRenew właściwość na true.

Ostrzeżenie

Opisane tutaj podejście jest wyzwalane na każdym żądaniu. Walidacja uwierzytelniania cookiedla wszystkich użytkowników na każdym żądaniu może spowodować dużą karę za wydajność aplikacji.

Trwałe cookies

Możesz chcieć cookie zachować ustawienia między sesjami przeglądarki. Ta trwałość powinna być włączona tylko z jawną zgodą użytkownika z polem wyboru "Zapamiętaj mnie" przy logowaniu lub podobnym mechanizmie.

Poniższy fragment kodu tworzy tożsamość i odpowiadające jej cookie działanie za pośrednictwem zamknięć przeglądarki. Wszystkie ustawienia wygasania przesuwanego wcześniej skonfigurowane są honorowane. cookie Jeśli wygaśnie po zamknięciu przeglądarki, przeglądarka wyczyści cookie ją po ponownym uruchomieniu.

Ustaw IsPersistent wartość na true w pliku AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

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

Można ustawić bezwzględny czas wygaśnięcia za pomocą polecenia ExpiresUtc. Aby utworzyć trwały cookieelement , IsPersistent należy również ustawić. cookie W przeciwnym razie element jest tworzony przy użyciu okresu istnienia opartego na sesji i może wygasnąć przed biletem uwierzytelniania lub po jego przechowywaniu. Po ExpiresUtc ustawieniu zastępuje wartość ExpireTimeSpan opcji CookieAuthenticationOptions, jeśli jest ustawiona.

Poniższy fragment kodu tworzy tożsamość i odpowiada cookie jej przez 20 minut. Spowoduje to zignorowanie wszystkich wcześniej skonfigurowanych ustawień wygasania.

// 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 to kompletny, w pełni funkcjonalny dostawca uwierzytelniania do tworzenia i obsługi identyfikatorów logowania. Można jednak użyć dostawcy uwierzytelniania opartego cookiena ASP.NET Core Identity . Aby uzyskać więcej informacji, zobacz Wprowadzenie do Identity ASP.NET Core.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

W celach demonstracyjnych w przykładowej aplikacji konto użytkownika hipotetycznego użytkownika Maria Rodriguez jest zakodowane w aplikacji. Użyj adresu maria.rodriguez@contoso.com e-mail i dowolnego hasła, aby zalogować się do użytkownika. Użytkownik jest uwierzytelniany w metodzie AuthenticateUserPages/Account/Login.cshtml.cs w pliku . W rzeczywistym przykładzie użytkownik zostanie uwierzytelniony w bazie danych.

Konfigurowanie

W metodzie Startup.ConfigureServices utwórz usługi oprogramowania pośredniczącego uwierzytelniania za AddAuthentication pomocą metod i :AddCookie

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

AuthenticationScheme przekazano do AddAuthentication ustawienia domyślnego schematu uwierzytelniania dla aplikacji. AuthenticationScheme jest przydatne, gdy istnieje wiele wystąpień uwierzytelniania i chcesz autoryzować cookieza pomocą określonego schematu. Ustawienie wartościCookie AuthenticationDefaults.AuthenticationScheme AuthenticationScheme zapewnia wartość "Cookies" dla schematu. Można podać dowolną wartość ciągu, która odróżnia schemat.

Schemat uwierzytelniania aplikacji różni się od schematu cookie uwierzytelniania aplikacji. cookie Jeśli schemat uwierzytelniania nie jest udostępniany w AddCookieprogramie , używa CookieAuthenticationDefaults.AuthenticationScheme wartości ("Cookies").

Właściwość uwierzytelniania cookiejest domyślnie ustawiona IsEssential na true wartość . Uwierzytelnianie cookiejest dozwolone, gdy osoba odwiedzająca witrynę nie wyraziła zgody na zbieranie danych. Aby uzyskać więcej informacji, zobacz Ogólne wsparcie dotyczące rozporządzenia o ochronie danych (RODO) w ASP.NET Core.

W Startup.Configurepliku wywołaj UseAuthentication metodę HttpContext.User i UseAuthorization ustaw właściwość i uruchom oprogramowanie pośredniczące autoryzacji dla żądań. Przed wywołaniem metody i UseAuthorization wywołaj metodę :UseAuthenticationUseEndpoints

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

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

Klasa CookieAuthenticationOptions służy do konfigurowania opcji dostawcy uwierzytelniania.

Ustaw CookieAuthenticationOptions w konfiguracji usługi na potrzeby uwierzytelniania w metodzie Startup.ConfigureServices :

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

Cookie Oprogramowanie pośredniczące zasad umożliwia korzystanie z cookie funkcji zasad. Dodawanie oprogramowania pośredniczącego do potoku przetwarzania aplikacji jest poufne — dotyczy tylko składników podrzędnych zarejestrowanych w potoku.

app.UseCookiePolicy(cookiePolicyOptions);

Służy CookiePolicyOptions do oprogramowania pośredniczącego Cookie zasad w celu kontrolowania globalnych cookie cech przetwarzania i przypinania do cookie procedur obsługi przetwarzania, gdy cookiepliki są dołączane lub usuwane.

Wartością domyślną MinimumSameSitePolicy jest SameSiteMode.Lax zezwolenie na uwierzytelnianie OAuth2. Aby ściśle wymusić zasady tej samej lokacji SameSiteMode.Strictprogramu , ustaw wartość MinimumSameSitePolicy. Mimo że to ustawienie powoduje przerwanie uwierzytelniania OAuth2 i innych schematów uwierzytelniania między źródłami, zwiększa poziom cookie zabezpieczeń dla innych typów aplikacji, które nie korzystają z przetwarzania żądań między źródłami.

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

Cookie Ustawienie Oprogramowania pośredniczącego zasad dla programu może mieć wpływ na ustawienie MinimumSameSitePolicyCookie.SameSite ustawień zgodnie CookieAuthenticationOptions z poniższą macierzą.

MinimumSameSitePolicy Cookie. SameSite Wynikowy Cookie. Ustawienie SameSite
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

Aby utworzyć informacje o użytkowniku cookie gospodarstwa, skonstruuj element ClaimsPrincipal. Informacje o użytkowniku są serializowane i przechowywane w pliku cookie.

Utwórz obiekt ClaimsIdentity z dowolnymi wymaganymi Claimelementami i wywołaj SignInAsync polecenie , aby zalogować użytkownika:

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

Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.

SignInAsync tworzy zaszyfrowany cookie kod i dodaje go do bieżącej odpowiedzi. Jeśli AuthenticationScheme nie zostanie określony, zostanie użyty schemat domyślny.

RedirectUri Jest używany tylko w kilku określonych ścieżkach domyślnie, na przykład ścieżki logowania i wylogowywanie ścieżek. Aby uzyskać więcej informacji, zobacz CookieŹródło programu AuthenticationHandler.

System ochrony danych ASP.NET Core jest używany do szyfrowania. W przypadku aplikacji hostowanej na wielu maszynach równoważenie obciążenia w aplikacjach lub przy użyciu farmy internetowej skonfiguruj ochronę danych tak, aby korzystała z tego samego pierścienia kluczy i identyfikatora aplikacji.

Wyloguj się

Aby wylogować bieżącego użytkownika i usunąć go cookie, wywołaj metodę SignOutAsync:

await HttpContext.SignOutAsync(
    CookieAuthenticationDefaults.AuthenticationScheme);

Jeśli CookieAuthenticationDefaults.AuthenticationScheme (lub "Cookies") nie jest używany jako schemat (na przykład "ContosoCookie"), podaj schemat używany podczas konfigurowania dostawcy uwierzytelniania. W przeciwnym razie jest używany schemat domyślny.

Gdy przeglądarka zamknie ją automatycznie usunie s ( cookienietrwałe cookies), ale nie cookiesą czyszczone po zamknięciu pojedynczej karty. Serwer nie jest powiadamiany o zdarzeniach zamknięcia karty lub przeglądarki.

Reagowanie na zmiany zaplecza

Po utworzeniu cookie elementu cookie element jest pojedynczym źródłem tożsamości. Jeśli konto użytkownika jest wyłączone w systemach zaplecza:

  • System uwierzytelniania aplikacji cookie nadal przetwarza żądania na podstawie uwierzytelniania cookie.
  • Użytkownik pozostaje zalogowany do aplikacji, o ile uwierzytelnianie cookie jest prawidłowe.

Zdarzenie ValidatePrincipal może służyć do przechwytywania cookie i zastępowania weryfikacji tożsamości. Weryfikowanie elementu na każdym żądaniu cookie zmniejsza ryzyko odwołanych użytkowników, którzy uzyskują dostęp do aplikacji.

Jednym z podejść do cookie walidacji jest śledzenie zmian bazy danych użytkownika. Jeśli baza danych nie została zmieniona od czasu wydania użytkownika, nie trzeba ponownie uwierzytelniać użytkownika cookie , jeśli jest cookie on nadal prawidłowy. W przykładowej aplikacji baza danych jest implementowana i IUserRepository przechowuje LastChanged wartość. Gdy użytkownik zostanie zaktualizowany w bazie danych, LastChanged wartość zostanie ustawiona na bieżący czas.

Aby unieważnić cookie element, gdy baza danych zmieni się na LastChanged podstawie wartości, utwórz element cookie z oświadczeniem zawierającym LastChanged bieżącą LastChanged wartość z bazy danych:

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

Aby zaimplementować przesłonięcia dla ValidatePrincipal zdarzenia, napisz metodę z następującym podpisem w klasie pochodzącej z CookieAuthenticationEventsklasy :

ValidatePrincipal(CookieValidatePrincipalContext)

Poniżej przedstawiono przykładową implementację elementu 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);
        }
    }
}

Zarejestruj wystąpienie zdarzeń podczas cookie rejestracji usługi w metodzie Startup.ConfigureServices . Podaj rejestrację usługi w zakresie dla klasyCustomCookieAuthenticationEvents:

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

services.AddScoped<CustomCookieAuthenticationEvents>();

Rozważ sytuację, w której nazwa użytkownika jest aktualizowana — decyzja, która nie ma wpływu na bezpieczeństwo w żaden sposób. Jeśli chcesz niedestrukcyjne zaktualizować nazwę główną użytkownika, wywołaj context.ReplacePrincipal i ustaw context.ShouldRenew właściwość na true.

Ostrzeżenie

Opisane tutaj podejście jest wyzwalane na każdym żądaniu. Walidacja uwierzytelniania cookiedla wszystkich użytkowników na każdym żądaniu może spowodować dużą karę za wydajność aplikacji.

Trwałe cookies

Możesz chcieć cookie zachować ustawienia między sesjami przeglądarki. Ta trwałość powinna być włączona tylko z jawną zgodą użytkownika z polem wyboru "Zapamiętaj mnie" przy logowaniu lub podobnym mechanizmie.

Poniższy fragment kodu tworzy tożsamość i odpowiadające jej cookie działanie za pośrednictwem zamknięć przeglądarki. Wszystkie ustawienia wygasania przesuwanego wcześniej skonfigurowane są honorowane. cookie Jeśli wygaśnie po zamknięciu przeglądarki, przeglądarka wyczyści cookie ją po ponownym uruchomieniu.

Ustaw IsPersistent wartość na true w pliku AuthenticationProperties:

// using Microsoft.AspNetCore.Authentication;

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

Można ustawić bezwzględny czas wygaśnięcia za pomocą polecenia ExpiresUtc. Aby utworzyć trwały cookieelement , IsPersistent należy również ustawić. cookie W przeciwnym razie element jest tworzony przy użyciu okresu istnienia opartego na sesji i może wygasnąć przed biletem uwierzytelniania lub po jego przechowywaniu. Po ExpiresUtc ustawieniu zastępuje wartość ExpireTimeSpan opcji CookieAuthenticationOptions, jeśli jest ustawiona.

Poniższy fragment kodu tworzy tożsamość i odpowiada cookie jej przez 20 minut. Spowoduje to zignorowanie wszystkich wcześniej skonfigurowanych ustawień wygasania.

// using Microsoft.AspNetCore.Authentication;

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