2016-01-24 153 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到期。