ASP.NET Core MVC:设置身份cookie的到期时间

时间:2016-01-24 18:27:56

标签: asp.net-mvc asp.net-identity asp.net-core asp.net-core-mvc

在我的ASP.NET核心MVC应用程序中,身份验证cookie的生命周期设置为“会话”,因此它会持续到我关闭浏览器为止。 我使用MVC的默认身份验证方案:

app.UseIdentity();

如何延长cookie的生命周期?

6 个答案:

答案 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 AuthenticationPropertiesIsPersistent设为真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

的TimeSpan中
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