我正在将ASP.NET Core 2.1与Microsoft Identity一起使用,并且用户抱怨仅在闲置约30分钟后,他们仍不断重定向到登录屏幕。我已经在ExpireTimeSpan中设置了60分钟,但它永远不会持续那么长时间。有什么建议吗?
这是Startup.cs文件中的内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IRFDbRepository, RFDbRepository>();
var connection = _configuration.GetConnectionString("RFDbConnection");
services.Configure<ConnectionStrings>(_configuration.GetSection("ConnectionStrings"));
services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(connection));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.AddIdentity<User, UserRole>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<User>, UserStore>();
services.AddTransient<IRoleStore<UserRole>, RoleStore>();
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Identity/Account/Login";
options.LogoutPath = "/Identity/Account/Logout";
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.SlidingExpiration = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IRFDbRepository rFDbRepository)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
loggerFactory.AddFile(_configuration.GetValue<string>("Logging:LogFile"));
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "ActionApi",
template: "api/{controller}/{action}/{id?}");
});
}
答案 0 :(得分:2)
我终于找到了这个问题的根源。
ASP.NET Core 2.1中的身份存在问题,如果您实现了自己的UserStore版本,但没有实现IUserSecurityStampStore,则将跳过大多数与安全戳有关的功能。
调用AddIdentity()时,它每30分钟会对securityStamp进行一次验证检查。
这会导致令人困惑的行为,即用户在30分钟后注销,即使cookie没有过期也是如此。
ASP.NET Core 2.2中显然有针对此问题的修复程序,更多详细信息在这里
https://github.com/aspnet/Identity/issues/1880
同时,您可以通过将其添加到startup.cs中来使UserStore实施IUserSecurityStampStore,或执行我目前做为快速修复的操作,这将故障之间的时间从30分钟增加到10小时。
services.Configure(o => o.ValidationInterval = TimeSpan.FromHours(10));