ASP.NET 核心 1.0 - MVC 6 - Cookie 过期
ASP.NET Core 1.0 - MVC 6 - Cookie Expiration
更新:
这绝对不是 RC1 中的错误。 cookie 设置与默认的 UserManager 和 UserStore 一起工作,因此它一定与我的 UserManager/UserStore 有关,我已经监督过了。我基本上在这里使用实现:
https://github.com/jesblit/ASPNET5-FormAuthenticationLDAP
原文Post:
我遇到持久登录问题。无论我如何配置 cookie,30 分钟后,用户都会自动注销(无论用户与应用程序交互多少)。
我设置我的应用程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddCaching();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromDays(1);
options.CookieName = ".MySessionCookieName";
});
services.AddEntityFramework()
.AddNpgsql()
.AddDbContext<Model1>(options =>
options.UseNpgsql(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<MinervaUser, MinervaRole>(options => {
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(1);
options.Cookies.ApplicationCookie.SlidingExpiration = true;
options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
})
.AddUserStore<MinervaUserStore<MinervaUser>>()
.AddRoleStore<MinervaRoleStore<MinervaRole>>()
.AddUserManager<MinervaUserManager>();
services.AddMvc();
}
并且:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
}
}
catch { }
}
app.UseIISPlatformHandler(options => { options.AuthenticationDescriptions.Clear(); options.AutomaticAuthentication = true; });
app.UseSession();
app.UseIdentity();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
登录操作是:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);
}
...
我正在使用默认的 SignInManager。如前所述,我在 Startup.Configure 和 Startup.ConfigureServices 中设置的过期超时根本没有效果。登录 -> 30 分钟 -> 自动注销:(
如何延长这个时间段?
(顺便说一句:自定义 User、UserManager、UserStore 不会以任何方式干扰 cookie,它们 "just" 验证凭据(它们应该做的;)))
TL;DR: 如果您有自定义用户管理器,请务必实施 GetSecurityStampAsync、UpdateSecurityStampAsync 并将 SupportsUserSecurityStamp 设置为 true。
这个问题的解决方案非常简单(但我没有在文档中的任何地方找到它)。作为默认实现(创建新的 ASP MVC6 应用程序...),我检查了他们的数据库表并找到了安全标记(我没有实现)。根据这个问题的答案 What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface? 这个邮票每 30 分钟重新验证一次,这出人意料地符合我的问题。所以,我所做的就是用
扩展我自己的 UserManager
public class MinervaUserManager:UserManager<MinervaUser>
// Minerva being the name of the project
{
...
public override bool SupportsUserSecurityStamp
{
get
{
return true;
}
}
public override async Task<string> GetSecurityStampAsync(MinervaUser user)
{
// Todo: Implement something useful here!
return "Token";
}
public override async Task<IdentityResult> UpdateSecurityStampAsync(MinervaUser user)
{
// Todo: Implement something useful here!
return IdentityResult.Success;
}
这些假人在每次更新时总是 return 相同的 SecurityStamp 和 "Success"。这与完全没有 SecurityStamps 阻止注销一样安全。
更新:
这绝对不是 RC1 中的错误。 cookie 设置与默认的 UserManager 和 UserStore 一起工作,因此它一定与我的 UserManager/UserStore 有关,我已经监督过了。我基本上在这里使用实现: https://github.com/jesblit/ASPNET5-FormAuthenticationLDAP
原文Post:
我遇到持久登录问题。无论我如何配置 cookie,30 分钟后,用户都会自动注销(无论用户与应用程序交互多少)。
我设置我的应用程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddCaching();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromDays(1);
options.CookieName = ".MySessionCookieName";
});
services.AddEntityFramework()
.AddNpgsql()
.AddDbContext<Model1>(options =>
options.UseNpgsql(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<MinervaUser, MinervaRole>(options => {
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(1);
options.Cookies.ApplicationCookie.SlidingExpiration = true;
options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
})
.AddUserStore<MinervaUserStore<MinervaUser>>()
.AddRoleStore<MinervaRoleStore<MinervaRole>>()
.AddUserManager<MinervaUserManager>();
services.AddMvc();
}
并且:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
}
}
catch { }
}
app.UseIISPlatformHandler(options => { options.AuthenticationDescriptions.Clear(); options.AutomaticAuthentication = true; });
app.UseSession();
app.UseIdentity();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
登录操作是:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation(1, "User logged in.");
return RedirectToLocal(returnUrl);
}
...
我正在使用默认的 SignInManager。如前所述,我在 Startup.Configure 和 Startup.ConfigureServices 中设置的过期超时根本没有效果。登录 -> 30 分钟 -> 自动注销:(
如何延长这个时间段?
(顺便说一句:自定义 User、UserManager、UserStore 不会以任何方式干扰 cookie,它们 "just" 验证凭据(它们应该做的;)))
TL;DR: 如果您有自定义用户管理器,请务必实施 GetSecurityStampAsync、UpdateSecurityStampAsync 并将 SupportsUserSecurityStamp 设置为 true。
这个问题的解决方案非常简单(但我没有在文档中的任何地方找到它)。作为默认实现(创建新的 ASP MVC6 应用程序...),我检查了他们的数据库表并找到了安全标记(我没有实现)。根据这个问题的答案 What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface? 这个邮票每 30 分钟重新验证一次,这出人意料地符合我的问题。所以,我所做的就是用
扩展我自己的 UserManagerpublic class MinervaUserManager:UserManager<MinervaUser>
// Minerva being the name of the project
{
...
public override bool SupportsUserSecurityStamp
{
get
{
return true;
}
}
public override async Task<string> GetSecurityStampAsync(MinervaUser user)
{
// Todo: Implement something useful here!
return "Token";
}
public override async Task<IdentityResult> UpdateSecurityStampAsync(MinervaUser user)
{
// Todo: Implement something useful here!
return IdentityResult.Success;
}
这些假人在每次更新时总是 return 相同的 SecurityStamp 和 "Success"。这与完全没有 SecurityStamps 阻止注销一样安全。