会话注销太早

时间:2018-11-23 17:28:58

标签: asp.net-core asp.net-identity

我正在将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?}");
        });
    }

1 个答案:

答案 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));