#asp.net #.net #asp.net-mvc #asp.net-core #cookies
#asp.net #.net #asp.net-mvc #asp.net-core #файлы cookie
Вопрос:
Я разрабатываю Asp.Net Ядро 3.1 веб-приложение MVC с идентификатором. Моя страница входа в систему работает нормально, но после добавления services.ConfigureApplicationCookie
она работает не так, как ожидалось, и продолжает перенаправлять меня на мой локальный индекс. Я не могу понять, что происходит на самом деле. Если я прокомментирую этот блок, все будет работать так, как ожидалось.
Вот мой метод ConfigureServices в файле запуска
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>(options => {
options.SignIn.RequireConfirmedAccount = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddIdentityCore<ApplicationUser>()
.AddRoles<IdentityRole>()
.AddClaimsPrincipalFactory<UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>>()
.AddEntityFrameworkStores<ApplicationDbContext>()
//.AddDefaultTokenProviders()
.AddDefaultUI();
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = ".ExpirationCookie";
options.Cookie.IsEssential = true;
options.Cookie.HttpOnly = true;
options.LoginPath = "/Identity/Pages/Account/Login";
options.AccessDeniedPath = "/Identity/Pages/Account/AccessDenied";
options.ExpireTimeSpan = TimeSpan.Zero;
options.SlidingExpiration = true;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = ValidateAsync.ValidatingAsync
};
})
.Configure<SecurityStampValidatorOptions>(options =>
{
options.ValidationInterval = TimeSpan.Zero;
});
services.AddSingleton<IEmailSender, EmailSender>();
services.Configure<EmailOptions>(Configuration);
services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
services.AddHangfireServer();
services.AddControllersWithViews(); //?
services.AddRazorPages().AddRazorRuntimeCompilation(); //?
services.AddScoped<IExpirationJob, ExpirationJob>();
services.AddScoped<IReminderJob, EmailReminder>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
//options.Password.RequireDigit = true;
//options.Password.RequireLowercase = true;
//options.Password.RequireNonAlphanumeric = true;
//options.Password.RequireUppercase = true;
//options.Password.RequiredLength = 6;
//options.Password.RequiredUniqueChars = 1;
// Lockout settings.
//options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
//options.Lockout.MaxFailedAccessAttempts = 5;
//options.Lockout.AllowedForNewUsers = true;
// User settings.
//options.User.AllowedUserNameCharacters =
// "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@ ";
//options.User.RequireUniqueEmail = false;
});
}
Ответ №1:
Из документа:
Определяет, сколько времени cookie будет оставаться действительным с момента его создания. Информация об истечении срока действия содержится в билете защищенного файла cookie. Из-за этого файл cookie с истекшим сроком действия будет проигнорирован, даже если он будет передан на сервер после того, как браузер должен был его удалить
В вашем ConfigureApplicationCookie
вы устанавливаете продолжительность жизни файлов cookie на zero
.
Проверка подлинности файлов cookie никогда не будет выполнена успешно, вам нужно изменить ее, например FromSeconds
, FromMinutes
, FromHours
…
//......
options.ExpireTimeSpan = TimeSpan.FromHours(24);
//.......