Sha*_*kaz 12 c# asp.net cookies session asp.net-core-2.0
几天前我决定将我的网络应用程序从asp.net核心1.1升级到核心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();
...
}
Run Code Online (Sandbox Code Playgroud)
问题是用户只能保持登录状态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.
});
Run Code Online (Sandbox Code Playgroud)
由于需要20-30分钟,它看起来像默认会话超时:
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...
});
Run Code Online (Sandbox Code Playgroud)
ASP.NET Core 1.1中的相同实现工作正常.
Sha*_*kaz 10
好的,我发了垃圾邮件不同的论坛:)这是我的发现.原始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);
});
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这样做是这样的:
检查用户是否记录〜每10秒发生一次,具体取决于请求比率.服务器在每次请求服务器时检查安全标记options.ValidationInterval = TimeSpan.FromSeconds(10)).
cookie至少有效30分钟options.ExpireTimeSpan = TimeSpan.FromMinutes(30);,但options.SlidingExpiration = true;如果页面刷新或导航,则可以延长.
重要!不要像我一样太"聪明",并且_userManager.UpdateSecurityStampAsync(user);在成功登录后不要运行.因为这会更新安全戳,下一次验证验证将失败.
服务器在最后一次请求后将会话保留一段有限的时间。您可以设置会话超时或使用默认值 20 分钟。
要更改默认值,请编辑ConfigureServices 方法。
public void ConfigureServices(IServiceCollection services)
{
....
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.CookieName = ".MyApplication";
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8746 次 |
| 最近记录: |