在我的ASP.NET核心MVC应用程序中,身份验证cookie的生命周期设置为“会话”,因此它会持续到我关闭浏览器为止。 我使用MVC的默认身份验证方案:
app.UseIdentity();
如何延长cookie的生命周期?
答案 0 :(得分:42)
您正在使用的ASP.NET Identity中间件是对UseCookieAuthentication
的一些调用的包装器,其中包括管道上的Cookie身份验证中间件。这可以在Identity中间件here on GitHub的构建器扩展的源代码中看到。在这种情况下,配置基础Cookie身份验证应如何工作所需的选项封装在IdentityOptions
上,并在设置依赖注入时进行配置。
事实上,查看我链接到您的源代码可以看到,当您致电app.UseIdentity()
时会运行以下内容:
var options = app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value;
app.UseCookieAuthentication(options.Cookies.ExternalCookie);
app.UseCookieAuthentication(options.Cookies.TwoFactorRememberMeCookie);
app.UseCookieAuthentication(options.Cookies.TwoFactorUserIdCookie);
app.UseCookieAuthentication(options.Cookies.ApplicationCookie);
return app;
要设置IdentityOptions
类,AddIdentity<TUser, TRole>
方法有一个重载版本,允许使用一个lambda配置选项。因此,您只需传入lambda来配置选项。在这种情况下,您只需访问选项类的Cookies
属性,并根据需要配置ApplicationCookie
。要更改时间范围,请执行
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1);
});
编辑: ExpireTimeSpan
属性仅在调用HttpContext.Authentication.SignInAsync
的情况下使用,我们会将AuthenticationProperties
的{{1}}实例设置为IsPersistent
{1}}。
尝试使用Cookie身份验证中间件,结果证明这是有效的:如果我们只是在没有此选项的情况下登录,我们会获得一个持续会话的cookie,如果我们将它们一起发送,我们会得到一个持续我们的cookie配置中间件时设置。
使用ASP.NET Identity,要做的是传递true
的参数isPersistent
,其值为PasswordSignInAsync
。这最终是true
传递SignInAsync
HttpContext
AuthenticationProperties
,IsPersistent
设为真var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
。电话最终会像:
RememberMe
如果我们将IsPersistent
设置为true或false,则bson.errors.InvalidStringData: strings in documents must be valid UTF-8: 'wxPython: Windows Styles and Events Hunter \xab The Mouse Vs. The Python'
配置的位置。
答案 1 :(得分:9)
版本2.0有一个答案,但它对我不起作用。我不得不这样做:
services.ConfigureApplicationCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(30);
});
默认值为14天。
答案 2 :(得分:8)
对于ASP.NET Core 2.0
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "CookieName";
options.Cookie.Expiration = TimeSpan.FromDays(2);
});
答案 3 :(得分:5)
在ASP.NET Core 2.0中使用ExpireTimeSpan属性而不是Cookie.Expiration。
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "CookieName";
options.ExpireTimeSpan = TimeSpan.FromHours(24);
options.SlidingExpiration = true;
});
来自docs:
Cookie.Expiration:获取或设置cookie的生命周期。目前,此选项无操作,并将在ASP.NET Core 2.1+中过时。使用ExpireTimeSpan选项设置cookie过期。
答案 4 :(得分:2)
尝试
app.UseIdentity().UseCookieAuthentication(
new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromHours(1)
}
);
答案 5 :(得分:1)
出于某种原因,我在使用SignInAsync([..], true)
时遇到了问题,但浏览器中从未显示过cookie(正确登录失败):
因此,我尝试将UTC时区差异添加到ExpireTimeSpan
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
// add TimeSpan with 5 minutes plus timezone difference from Utc time
o.Cookies.ApplicationCookie.ExpireTimeSpan = DateTime.Now.Subtract(DateTime.UtcNow).Add( TimeSpan.FromMinutes(5) );
});
瞧!它工作正常,cookie只在浏览器中以 + 5min 到期时显示。
PingBack到github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576