几天前,我决定将我的网络应用程序从 asp.net core 1.1 升级到 core 2.0。稍作更改后一切似乎都正常,除了身份验证不会持续超过 20-30 分钟。
我们可以使用 Visual Studio 中的默认示例,因为我在自己的 webapp 和 "ASP.NET Core Web Application"-> .NET Framework 4.6.1 + ASP.NET Core 2.0 + 中遇到了同样的问题MVC + 个人用户帐户。
配置是默认的,应该是用户登录 14 天:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
...
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseAuthentication();
...
}
问题是用户只能保持登录状态 20-30 分钟。当用户登录时(选择“记住我”),您可以浏览页面,甚至重新打开浏览器,用户保持登录状态。因此,身份验证 cookie 似乎正在工作。但是,20-30 分钟后用户自动注销,或者我应该说 cookie 过期(我不知道会发生什么)。您可以重新登录,游戏重新开始。
我已经尝试设置应用程序 cookie 过期,但这并没有解决问题:
services.ConfigureApplicationCookie(options => {
options.ExpireTimeSpan = TimeSpan.FromDays(1); // Just shortens cookie expiration time, but still logs out users after 20-30 minutes.
});
由于需要 20-30 分钟,因此看起来像是默认 session 超时:
services.AddSession(options =>
{
options.Cookie.Expiration = TimeSpan.FromDays(1); // This throws an error "Expiration cannot be set for the cookie defined by SessionOptions"
options.IdleTimeout = TimeSpan.FromDays(1); // This changes session sliding expiration time...
});
相同的实现在 ASP.NET Core 1.1 中运行良好。
最佳答案
好吧,那么我就此向不同的论坛发送了垃圾邮件 :) 这是我的发现。原创https://github.com/aspnet/Identity/issues/1389
我对这一切如何运作的理解似乎存在很大差距。我也发现我撒了一点谎。所以为了其他像我一样愚蠢的人结束。
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.Configure<SecurityStampValidatorOptions>(options => options.ValidationInterval = TimeSpan.FromSeconds(10));
services.AddAuthentication()
.Services.ConfigureApplicationCookie(options =>
{
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
});
根据我的理解,它是这样工作的:
检查用户是否登录大约每 10 秒发生一次,具体取决于请求比率。服务器根据对服务器的每个请求检查安全标记
options.ValidationInterval = TimeSpan.FromSeconds(10))
。cookie 至少在 30 分钟内有效
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
,但可以通过options.SlidingExpiration = true;
延长> 如果页面被刷新或导航。重要!不要像我一样太“聪明”,不要在成功登录后立即运行
_userManager.UpdateSecurityStampAsync(user);
。因为这会更新安全戳,下一次验证验证将失败。
关于c# - asp.net-core2.0 用户在 20-30 分钟后自动注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825684/