2016-01-24 137 views
18

在我的ASP.NET Core MVC应用程序中,身份验证cookie的生存期被设置为'Session',因此它会持续到关闭浏览器为止。 我用缺省的认证方案为MVC:ASP.NET Core MVC:设置身份cookie到期

app.UseIdentity(); 

如何延长cookie的寿命是多少?

回答

29

您正在使用ASP.NET身份中间件是身边的一些呼叫wraper到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的实例与IsPersistent集传递给true

刚刚尝试使用Cookie身份验证中间件,事实证明这起作用:如果我们只是在没有此选项的情况下登录,我们会得到一个持续用于会话的cookie,如果我们一起发送,我们会得到一个cookie,我们在配置中间件时进行设置。

使用ASP.NET Identity的方法是将PasswordSignInAsync的参数isPersistent与值true一起传递。这最终将通过AuthenticationProperties中的HttpContextSignInAsync调用,IsPersistent设置为true。通话结束是这样的:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 

RememberMe是,如果我们设置IsPersistent为true或false什么配置。

+0

谢谢,使用此方法,我可以使用此方法更改cookie的名称,但即使设置了ExpireTimeSpan,auth cookie的生命周期也会设置为“会话”。 任何想法为什么? 这是我的Startup.cs:https://github.com/severisv/MyTeam/blob/master/src/MyTeam/Startup.cs 我试过禁用Facebook-auth。我没有使用https。 – severin

+0

@fiskeboss我添加了一个关于我在这件事上发现的内容的编辑。 – user1620696

+0

啊,当然,谢谢! – severin

2

尝试

app.UseIdentity().UseCookieAuthentication(
    new CookieAuthenticationOptions 
    { 
     ExpireTimeSpan = TimeSpan.FromHours(1) 
    } 
); 
+0

我试过了,用其他选项,但似乎被忽略。 –

1

出于某种原因,我使用SignInAsync([..], true)当饼干从未在浏览器中显示(与正常登录失败)有问题:

所以,我尝试添加了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)); 

}); 

Voila!它的工作原理和cookie仅在浏览器中以+ 5min过期显示。

参照通知到github.com https://github.com/aspnet/Identity/issues/766#issuecomment-253237576

1

对于ASP.NET核2.0

services.ConfigureApplicationCookie(options => 
     { 
      options.Cookie.Name = "CookieName"; 
      options.Cookie.Expiration = TimeSpan.FromDays(2); 
     }); 
3

有2.0版本的答案,但它并没有为我工作。我不得不这样做:

services.ConfigureApplicationCookie(options => 
{ 
    options.ExpireTimeSpan = TimeSpan.FromDays(30); 
}); 

的默认值是14天。

1

在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到期。