Cookie 身份验证提前到期

Tab*_*Tab 5 c# asp.net-mvc asp.net-core-2.0

问题

在我的 ASP.NET MVC Core 2.0 应用程序中,我已设置为使用 cookie 身份验证方案而不使用 Identity,因为我们有自己的后端身份验证存储和 api。

身份验证和授权每次都能完美运行。

但是,无论登录/会话在大约 30 分钟后过期。您可以看到我们将身份验证 cookie 和会话 cookie 的超时设置为 120 分钟。

应用信息:

  • 平台:.Net 4.7.x (Windows)
  • 框架:Asp.Net Core 2.x
  • IIS 用作代理服务器

欢迎任何有关如何解决此问题的帮助或意见

代码

更新:替换services.AddMemoryCache()services.AddDistributedRedisCache(..)- 测试以查看其工作原理

启动文件

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();
}
Run Code Online (Sandbox Code Playgroud)

账户控制器.cs

[HttpPost("Login")]
public async Task<IActionResult> Login(AccountModel model)
{
    var claims = new List<Claim>();
    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);
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 3

您正在使用与进程相关的内存中会话。IIS 中的该进程就是您的应用程序池。默认情况下,应用程序池在一段时间后会自动回收。当它回收时,它会占用你的会话时间。

使用持久会话存储:SQL Server、Redis等(会话使用分布式缓存,因此设置持久会话的方式就是设置持久分布式缓存存储。)