Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Автор: Рик Андерсон (Rick Anderson)
ASP.NET Core Identity — это полный полнофункциональный поставщик проверки подлинности для создания и обслуживания имен входа. Однако можно использовать поставщика проверки подлинности на основе cookie без ASP.NET Core Identity. Дополнительные сведения см. в статье Введение в Identity в ASP.NET Core.
Просмотреть или скачать образец кода (описание загрузки)
Для демонстрационных целей в примере приложения учетная запись пользователя для гипотетического пользователя Maria Rodriguez жестко закодирована в приложение. Используйте адрес Emailmaria.rodriguez@contoso.com и любой пароль для входа в систему пользователя. Пользователь аутентифицируется в методе AuthenticateUser в файле Pages/Account/Login.cshtml.cs. В реальном примере пользователь будет проходить проверку подлинности в хранилище данных.
Это важно
Начиная с ASP.NET Core 10, известные точки доступа API больше не перенаправляются на страницы входа при использовании cookie аутентификации. Вместо этого они возвращают коды состояния 401/403. Дополнительные сведения см. в статье о поведении проверки подлинности конечной точки API в ASP.NET Core.
Добавить cookie проверку подлинности
- Добавьте службы ПО промежуточного слоя проверки подлинности с помощью методов AddAuthentication и AddCookie.
- Вызовите UseAuthentication и UseAuthorization, чтобы задать свойство
HttpContext.Userи запустить промежуточное ПО авторизации для запросов.UseAuthenticationиUseAuthorizationдолжны вызываться передMapтакими методами, как MapRazorPages и MapDefaultControllerRoute.
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 передается в AddAuthentication чтобы установить схему проверки подлинности по умолчанию для приложения. AuthenticationScheme на CookieAuthenticationDefaults.AuthenticationScheme обеспечивает значение "Cookies" для схемы. Любое строковое значение можно использовать, которое отличает схему.
Если CookieAuthenticationDefaults.AuthenticationScheme (значение по умолчанию: "Cookies") не используется в качестве схемы, укажите схему, используемую при настройке поставщика проверки подлинности. В противном случае используется схема по умолчанию. Например, если "ContosoCookie" используется в качестве схемы, укажите схему, используемую при настройке поставщика проверки подлинности.
По умолчанию, свойству проверки подлинности cookieIsEssential задано значение true. Файлы cookie проверки подлинности разрешены, если посетитель сайта не предоставил согласие на сбор данных. Дополнительные сведения см. в разделе Общий регламент по защите данных (GDPR) в ASP.NET Core.
Класс CookieAuthenticationOptions используется для настройки параметров поставщика проверки подлинности.
Настройте CookieAuthenticationOptions в методе 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();
Cookie Программное обеспечение промежуточного слоя политики
ПО Cookie промежуточного слоя политики (источник GitHub)UseCookiePolicy включает cookie возможности политики. Промежуточное программное обеспечение обрабатывается в том порядке, в котором оно добавляется, и Cookie политическое промежуточное программное обеспечение следует добавлять перед cookie посредническим программным обеспечением аутентификации.
Используйте CookiePolicyOptions, предоставленный для промежуточного слоя Cookie политики, чтобы управлять глобальными характеристиками обработки cookie и подключаться к обработчикам cookie обработки при добавлении или удалении файлов cookie.
Значение по умолчанию MinimumSameSitePolicy равно SameSiteMode.Lax, чтобы разрешить аутентификацию посредством OAuth2. Чтобы строго применить ту же политику SameSiteMode.Strictсайта, задайте параметр MinimumSameSitePolicy. Хотя этот параметр нарушает OAuth2 и другие схемы межуровневой проверки подлинности, он повышает уровень cookie безопасности для других типов приложений, которые не используют обработку запросов между источниками.
В следующем примере показано, как настроить cookie проверку подлинности с помощью Cookie промежуточного слоя политики:
var cookiePolicyOptions = new CookiePolicyOptions
{
MinimumSameSitePolicy = SameSiteMode.Strict,
};
app.UseCookiePolicy(cookiePolicyOptions);
Параметр Cookie Policy Middleware для MinimumSameSitePolicy может влиять на установку Cookie.SameSite в параметрах CookieAuthenticationOptions, как указано в матрице ниже.
| MinimumSameSitePolicy | Cookie. SameSite | Результирующая Cookie настройка 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 |
Создание проверки подлинности cookie
Чтобы создать cookie, содержащий информацию о пользователе, создайте объект ClaimsPrincipal. Сведения о пользователе сериализуются и хранятся в объекте cookie.
Создайте ClaimsIdentity с любыми необходимыми Claim и вызовите SignInAsync для входа пользователя.
Login.cshtml.cs В примере приложения содержится следующий код:
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();
}
SignInAsync создает зашифрованный cookie и добавляет его в текущий ответ. Если AuthenticationScheme не указано, используется схема по умолчанию.
RedirectUri используется только для нескольких определенных путей по умолчанию, например пути входа и пути выхода. Дополнительные сведения см. в исходном коде CookieAuthenticationHandler.
Система защиты данных ASP.NET Core используется для шифрования. Для приложения, размещённого на нескольких компьютерах, балансировки нагрузки между приложениями или использования веб-фермы необходимо настроить защиту данных для использования одного и того же кольца ключей и идентификатора приложения.
Выйти
Чтобы выйти из текущего пользователя и удалить его cookie, вызовите 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;
}
Если CookieAuthenticationDefaults.AuthenticationScheme (значение по умолчанию: "Cookies") не используется в качестве схемы, укажите схему, используемую при настройке поставщика проверки подлинности. В противном случае используется схема по умолчанию. Например, если "ContosoCookie" используется в качестве схемы, укажите схему, используемую при настройке поставщика проверки подлинности.
Когда браузер закрывает его автоматически, удаляет файлы cookie на основе сеанса (не постоянные файлы cookie), но при закрытии отдельной вкладки файлы cookie не удаляются. Сервер не уведомляется о событиях закрытия вкладки или браузера.
Реагирование на внутренние изменения
После создания cookiecookie является единственным источником идентичности. Если учетная запись пользователя отключена в внутренних системах:
- Система проверки подлинности приложения cookie продолжает обрабатывать запросы на основе проверки подлинности cookie.
- Пользователь остается в системе, пока проверка подлинности действительна cookie.
Событие ValidatePrincipal можно использовать для перехвата и переопределения проверки идентичности cookie. Проверка cookie на каждом запросе снижает риск доступа лишённых доступа пользователей к приложению.
Один из подходов к cookie проверке основан на отслеживании изменений пользовательской базы данных. Если база данных не была изменена после выдачи cookie пользователю, вам не нужно повторно аутентифицировать пользователя, если его cookie по-прежнему действителен. В примере приложения база данных реализована в IUserRepository и сохраняет значение LastChanged. При обновлении информации о пользователе в базе данных значение LastChanged устанавливается на текущее время.
Чтобы сделать cookie недействительным, если база данных изменяется на основе значения LastChanged, создайте cookie с утверждением LastChanged, содержащим текущее значение LastChanged из базы данных.
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));
Чтобы реализовать переопределение для ValidatePrincipal события, напишите метод со следующей сигнатурой в классе, наследуемом от CookieAuthenticationEvents:
ValidatePrincipal(CookieValidatePrincipalContext)
Ниже приведен пример реализации 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);
}
}
}
Зарегистрируйте экземпляр событий при регистрации службы cookie. Укажите регистрацию сервиса с областью видимости для вашего классаCustomCookieAuthenticationEvents.
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();
Рассмотрим ситуацию, в которой имя пользователя обновляется— решение, которое не влияет на безопасность каким-либо образом. Если вы хотите без ущерба обновить основного пользователя, вызовите context.ReplacePrincipal и установите значение свойства true в context.ShouldRenew.
Warning
Описанный здесь подход активируется при каждом запросе. Проверка аутентификационных cookie-файлов для всех пользователей при каждом запросе может привести к значительному снижению производительности приложения.
Постоянные файлы cookie
Возможно, вы хотите, чтобы cookie сохранялся между сеансами браузера. Эта сохраняемость должна быть включена только с явным согласием пользователя с флажком "Запомнить меня" для входа или аналогичного механизма.
В следующем фрагменте кода создается идентификатор и соответствующий cookie, которые сохраняются после закрытия браузера. Все параметры скользящего срока действия, настроенные ранее, учитываются. cookie Если срок действия истекает, пока браузер закрыт, браузер очищает cookie после перезапуска.
Задайте IsPersistent в true в AuthenticationProperties:
// using Microsoft.AspNetCore.Authentication;
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = true
});
Абсолютный cookie срок действия
Абсолютное время окончания срока действия можно задать с помощью ExpiresUtc. Чтобы создать постоянный объект cookie, необходимо также задать IsPersistent.
cookie В противном случае создается с временем существования на основе сеанса и может истечь либо раньше, либо позже билета аутентификации, который он содержит. Если ExpiresUtc задано, он переопределяет значение ExpireTimeSpan параметра CookieAuthenticationOptions, если задано.
В следующем фрагменте кода создается идентификатор и соответствующий cookie, которые действуют в течение 20 минут. Это игнорирует все параметры скользящего срока действия, настроенные ранее.
// 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 — это полный полнофункциональный поставщик проверки подлинности для создания и обслуживания имен входа. Однако можно использовать поставщика проверки подлинности на основе cookie без ASP.NET Core Identity. Дополнительные сведения см. в статье Введение в Identity в ASP.NET Core.
Просмотреть или скачать образец кода (описание загрузки)
Для демонстрационных целей в примере приложения учетная запись пользователя для гипотетического пользователя Maria Rodriguez жестко закодирована в приложение. Используйте адрес Emailmaria.rodriguez@contoso.com и любой пароль для входа в систему пользователя. Пользователь аутентифицируется в методе AuthenticateUser в файле Pages/Account/Login.cshtml.cs. В реальном примере пользователь будет проходить проверку подлинности в базе данных.
Configuration
В методе Startup.ConfigureServices создайте службы промежуточного слоя аутентификации с методами AddAuthentication и AddCookie.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
AuthenticationScheme передается в AddAuthentication чтобы установить схему проверки подлинности по умолчанию для приложения.
AuthenticationScheme полезно, если имеется несколько экземпляров cookie проверки подлинности, и требуется авторизоваться с использованием определенной схемы. Установка AuthenticationScheme на CookieAuthenticationDefaults.AuthenticationScheme задает значение "Cookies" для схемы. Можно указать любое строковое значение, которое отличает схему.
Схема проверки подлинности приложения отличается от схемы проверки подлинности приложения cookie . Если схема аутентификации не предоставляется AddCookie, она использует CookieAuthenticationDefaults.AuthenticationScheme ("Файлы cookie").
По умолчанию, свойству проверки подлинности cookieIsEssential задано значение true. Файлы cookie проверки подлинности разрешены, если посетитель сайта не предоставил согласие на сбор данных. Дополнительные сведения см. в разделе Общий регламент по защите данных (GDPR) в ASP.NET Core.
В Startup.Configure вызовите UseAuthentication и UseAuthorization, чтобы задать свойство HttpContext.User и запустить промежуточное ПО авторизации для запросов. Вызовите методы UseAuthentication и UseAuthorization перед вызовом UseEndpoints:
Класс CookieAuthenticationOptions используется для настройки параметров поставщика проверки подлинности.
Задайте
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
...
});
Cookie Программное обеспечение промежуточного слоя политики
Cookie Промежуточное ПО для политик предоставляет cookie функции политики. Добавление промежуточного слоя в конвейер обработки приложений чувствительно к порядку — оно влияет только на подчиненные компоненты, зарегистрированные в конвейере, и промежуточный слой политики следует добавить до промежуточного слоя проверки подлинности.
Используйте CookiePolicyOptions, предоставленный для промежуточного слоя Cookie политики, чтобы управлять глобальными характеристиками обработки cookie и подключаться к обработчикам cookie обработки при добавлении или удалении файлов cookie.
Значение по умолчанию MinimumSameSitePolicy равно SameSiteMode.Lax, чтобы разрешить аутентификацию посредством OAuth2. Чтобы строго применить ту же политику SameSiteMode.Strictсайта, задайте параметр MinimumSameSitePolicy. Хотя этот параметр нарушает OAuth2 и другие схемы межуровневой проверки подлинности, он повышает уровень cookie безопасности для других типов приложений, которые не используют обработку запросов между источниками.
В следующем примере показано, как настроить cookie проверку подлинности с помощью Cookie промежуточного слоя политики:
var cookiePolicyOptions = new CookiePolicyOptions
{
MinimumSameSitePolicy = SameSiteMode.Strict,
};
app.UseCookiePolicy(cookiePolicyOptions);
Параметр Cookie Policy Middleware для MinimumSameSitePolicy может влиять на установку Cookie.SameSite в параметрах CookieAuthenticationOptions, как указано в матрице ниже.
| MinimumSameSitePolicy | Cookie. SameSite | Результирующая Cookie настройка 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 |
Создание проверки подлинности cookie
Чтобы создать cookie, содержащий информацию о пользователе, создайте объект ClaimsPrincipal. Сведения о пользователе сериализуются и хранятся в объекте cookie.
Создайте ClaimsIdentity с любыми необходимыми Claim и вызовите SignInAsync, чтобы войти пользователя.
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 создает зашифрованный cookie и добавляет его в текущий ответ. Если AuthenticationScheme не указано, используется схема по умолчанию.
RedirectUri используется только для нескольких определенных путей по умолчанию, например пути входа и пути выхода. Дополнительные сведения см. в исходном коде CookieAuthenticationHandler.
Система защиты данных ASP.NET Core используется для шифрования. Для приложения, размещённого на нескольких компьютерах, балансировки нагрузки между приложениями или использования веб-фермы необходимо настроить защиту данных для использования одного и того же кольца ключей и идентификатора приложения.
Выйти
Чтобы выйти из текущего пользователя и удалить его cookie, вызовите SignOutAsync:
await HttpContext.SignOutAsync(
CookieAuthenticationDefaults.AuthenticationScheme);
Если CookieAuthenticationDefaults.AuthenticationScheme (значение по умолчанию: "Cookies") не используется в качестве схемы, укажите схему, используемую при настройке поставщика проверки подлинности. В противном случае используется схема по умолчанию. Например, если "ContosoCookie" используется в качестве схемы, укажите схему, используемую при настройке поставщика проверки подлинности.
Когда браузер закрывает его автоматически, удаляет файлы cookie на основе сеанса (не постоянные файлы cookie), но при закрытии отдельной вкладки файлы cookie не удаляются. Сервер не уведомляется о событиях закрытия вкладки или браузера.
Реагирование на внутренние изменения
После создания cookiecookie является единственным источником идентичности. Если учетная запись пользователя отключена в внутренних системах:
- Система проверки подлинности приложения cookie продолжает обрабатывать запросы на основе проверки подлинности cookie.
- Пользователь остается в системе, пока проверка подлинности действительна cookie.
Событие ValidatePrincipal можно использовать для перехвата и переопределения проверки идентичности cookie. Проверка cookie на каждом запросе снижает риск доступа лишённых доступа пользователей к приложению.
Один из подходов к cookie проверке основан на отслеживании изменений пользовательской базы данных. Если база данных не была изменена после выдачи cookie пользователю, вам не нужно повторно аутентифицировать пользователя, если его cookie по-прежнему действителен. В примере приложения база данных реализована в IUserRepository и сохраняет значение LastChanged. При обновлении информации о пользователе в базе данных значение LastChanged устанавливается на текущее время.
Чтобы сделать cookie недействительным, если база данных изменяется на основе значения LastChanged, создайте cookie с утверждением LastChanged, содержащим текущее значение LastChanged из базы данных.
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));
Чтобы реализовать переопределение для ValidatePrincipal события, напишите метод со следующей сигнатурой в классе, наследуемом от CookieAuthenticationEvents:
ValidatePrincipal(CookieValidatePrincipalContext)
Ниже приведен пример реализации 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);
}
}
}
Зарегистрируйте экземпляр событий во время cookie регистрации службы в методе Startup.ConfigureServices . Укажите регистрацию сервиса с областью видимости для вашего классаCustomCookieAuthenticationEvents.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.EventsType = typeof(CustomCookieAuthenticationEvents);
});
services.AddScoped<CustomCookieAuthenticationEvents>();
Рассмотрим ситуацию, в которой имя пользователя обновляется— решение, которое не влияет на безопасность каким-либо образом. Если вы хотите без ущерба обновить основного пользователя, вызовите context.ReplacePrincipal и установите значение свойства true в context.ShouldRenew.
Warning
Описанный здесь подход активируется при каждом запросе. Проверка аутентификационных cookie-файлов для всех пользователей при каждом запросе может привести к значительному снижению производительности приложения.
Постоянные файлы cookie
Возможно, вы хотите, чтобы cookie сохранялся между сеансами браузера. Эта сохраняемость должна быть включена только с явным согласием пользователя с флажком "Запомнить меня" для входа или аналогичного механизма.
В следующем фрагменте кода создается идентификатор и соответствующий cookie, которые сохраняются после закрытия браузера. Все параметры скользящего срока действия, настроенные ранее, учитываются. cookie Если срок действия истекает, пока браузер закрыт, браузер очищает cookie после перезапуска.
Задайте IsPersistent в true в AuthenticationProperties:
// using Microsoft.AspNetCore.Authentication;
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = true
});
Абсолютный cookie срок действия
Абсолютное время окончания срока действия можно задать с помощью ExpiresUtc. Чтобы создать постоянный объект cookie, необходимо также задать IsPersistent.
cookie В противном случае создается с временем существования на основе сеанса и может истечь либо раньше, либо позже билета аутентификации, который он содержит. Если ExpiresUtc задано, он переопределяет значение ExpireTimeSpan параметра CookieAuthenticationOptions, если задано.
В следующем фрагменте кода создается идентификатор и соответствующий cookie, которые действуют в течение 20 минут. Это игнорирует все параметры скользящего срока действия, настроенные ранее.
// using Microsoft.AspNetCore.Authentication;
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTime.UtcNow.AddMinutes(20)
});
ASP.NET Core