Cookie身份validation提前到期
问题
在我的ASP.NET MVC Core 2.0应用程序中,我设置了使用cookie身份validation方案而不使用Identity,因为我们拥有自己的后端身份validation存储和api。
身份validation和授权每次都能完美运行。
但是,无论登录/会话在大约30分钟后过期。 您可以看到我们将身份validationcookie和会话cookie的超时设置为120分钟。
应用信息:
- 平台:.Net 4.7.x(Windows)
- 框架:Asp.Net Core 2.x
- IIS用作代理服务器
如何解决这个问题的任何帮助或意见都将受到欢迎
码
更新:用services.AddDistributedRedisCache(..)
替换services.AddMemoryCache()
– 测试看看它是如何工作的
Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddDistributedRedisCache(options => { options.Configuration = "localhost"; options.InstanceName = "CoreTestInstance"; }); services.AddAuthentication("CookieAuthenticationScheme") .AddCookie("CookieAuthenticationScheme", options => { options.Cookie.Name = authSettings.Name; options.Cookie.HttpOnly = false; options.Cookie.Expiration = TimeSpan.FromMinutes(120); options.ExpireTimeSpan = TimeSpan.FromMinutes(120); options.AccessDeniedPath = new PathString("/Errors/StatusCodeErrors/401"); options.LoginPath = "/Account/Login"; }); // services.AddMemoryCache(); services.AddSession(options => { options.Cookie.Name = sessSettings.Name; options.Cookie.HttpOnly = false; options.IdleTimeout = TimeSpan.FromMinutes(120); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Errors/Default"); } app.UseStatusCodePagesWithRedirects("/Errors/StatusCodeErrors/{0}"); app.UseStaticFiles(); app.UseAuthentication(); app.UseSession(); app.UseMvc(); }
AccountController.cs
[HttpPost("Login")] public async Task Login(AccountModel model) { var claims = new List(); claims.Add(new Claim(ClaimTypes.Name, model.UserName)); claims.Add(new Claim(ClaimTypes.Role, "Administrator", ClaimValueTypes.String, model.UserName)); var identity = new ClaimsIdentity(claims, "login"); var principal = new ClaimsPrincipal(identity); await HttpContext.SignInAsync("CookieAuthenticationScheme", principal); }
您正在使用与进程相关联的内存中会话。 IIS中的该过程是您的应用程序池。 默认情况下,应用程序池会在一段时间后自动回收。 当它回收时,它需要你的会话。
使用持久会话存储 :SQL Server,Redis等(会话使用分布式缓存,因此设置持久会话的方式是设置持久性分布式缓存存储。)
感谢Chris Pratt让我朝着正确的方向前进。 迁移到Redis有助于提高性能,分布式缓存是正确的方法。
但是,Redis没有解决我的问题,应用程序在90分钟后仍然超时,无论我的设置如何。
由于我们使用IIS,我最终不得不更改AppPool中的设置以最终使会话符合我的超时而不是AppPool。
- 对于AppPool,单击“高级设置”并进行以下更改:
- 部分: 过程模型
- 空闲超时(分钟)= 0(禁用超时,以便应用程序池永远不会因空闲而关闭)
- 空闲超时操作=挂起(挂起的工作进程仍处于活动状态,但会被分页到磁盘,从而减少了它消耗的系统资源)
- 部分: 回收
- 常规时间间隔(分钟)= 0(设置为0表示apppool不会回收)
- 部分: 过程模型
注意:除非您在同一台服务器上运行了大量应用程序,否则上述设置不应影响其他应用程序。 我建议您在使用之前详细研究设置,以确保它们适合您。
最后,我使用各种设置运行了几个测试(我们将它们存储在appsettings.json中),暂停时间为2分钟,10分钟,1小时,最后2个小时,所有设置都按要求工作。
- ASP.Net MVC核心2 – 区域路由
- HttpClient和ASP.NET Core 2.0 Web服务之间的连接已关闭错误
- 找不到Microsoft.AspNetCore.Antiforgery
- 为什么Scoped服务解析为同一请求的两个不同实例?
- 在.Net Core 2.0和Angular中使用’dotnet publish’时找不到模块’aspnet-webpack’
- ASP.Net Core 2.0:无需请求即可创建UrlHelper
- 在IServiceCollection扩展中获取服务
- ASN.NET Core 2.0 Facebook身份validationExternalLoginSignInAsync失败(IsNotAllowed)
- 为什么AntiForgeryTokenvalidation会失败?