首页 > 解决方案 > asp net core 3.1 Session永不过期

问题描述

我已经尝试了在 StackOverflow 上找到的所有内容,但我仍然无法管理 Session(内容)自动过期。

我试过了:

我不会在 ajax 调用上访问会话数据(设置、获取),因此这不能自动增加会话过期时间。

在旧的 AspNet MVC 中它是如此简单/琐碎 - 立即按预期工作。

所做的就是将自定义登录(数据)存储到 Session 中,并期望 Session 在用户不活动 20 分钟后下降。但这永远不会发生。

有任何想法吗?

编辑:饼干

 lb_commonator=ffffffff0972280045525d5f4f58455e445a4a423660; crowd.token_key=7qN9z4UYR3tCjYdronwmOw00; .AspNetCore.Antiforgery.tYkxYH7Bg6I=CfDJ8OahW8JbNMdPv78xOmnUC6BtivuFvWy4RhYaN0oRtiUvkLpVtHLxgQaQOS1RTNqT8E0LaobeaNdLIhhoy4z4qSJleqiK2QJTWEptEDFAITNCTdh03AIqcd0mBL0FZeFcr5GalTfqiNahST7eUL7Wnpg; .AspNetCore.Session=CfDJ8OahW8JbNMdPv78xOmnUC6Cwi2HZVPs93%2Bohf8c%2BvQ1hWZVHeu54cwkg8PND41KXN1F%2BeAOSnTnkiT3RAGb3mPQjLRMpcq1x9f5KFrgegRRoEDHx%2FgEknhSOo8yCfKp1srlrzTWUtpUF8tsFKn1JwPLI9fHT77SGscSkTMrsueYr

编辑 2(IdleTimeout 和 ExpireTimeSpan 根本没有效果):

    // Add session
    // Add session
    // Add session
    services.AddSession();

    // TESTING: TODO:
    // TESTING: TODO:
    // TESTING: TODO:
    //services.AddSession(options =>
    //{
    //    options.IdleTimeout = TimeSpan.FromSeconds(10);
    //});
    //services.ConfigureApplicationCookie(options =>
    // {
    //     options.SlidingExpiration = true;
    //     options.ExpireTimeSpan = TimeSpan.FromSeconds(10);
    // });

编辑 3:

在此处输入图像描述

标签: asp.net-coreasp.net-core-3.1

解决方案


// TESTING: TODO:
// TESTING: TODO:
// TESTING: TODO:
//services.AddSession(options =>
//{
//    // session data experation in storage
//    // for example, if you use redis, this will add ttl 10 secs
//    // for data in redis, but no influence to cookie lifitime
//    options.IdleTimeout = TimeSpan.FromSeconds(10);
//    // this will affect on cookie liftime in browser
//    // if you do not set it, cookie will be Session
//    // and expire when you close your browser
//    options.Cookie.MaxAge = TimeSpan.FromHours(1);
//});

在此处输入图像描述

编辑:

  1. 要刷新现有会话 cookie,您需要跟踪 cookie 创建时间,例如在会话数据中并在中间件中重置 cookie

         app.Use(async (context, next) =>
         {
             string sessionCookie;
             if (/*add here expiration check &&*/ context.Request.Cookies.TryGetValue("SessionCookieName", out sessionCookie))
             {
                 context.Response.Cookies.Append("SessionCookieName", sessionCookie, new CookieOptions
                 {
                     MaxAge = TimeSpan.FromSeconds(10),
                     HttpOnly = true,
                     SameSite = SameSiteMode.Lax,
                     Path = "/"
                 });
             }
             await next.Invoke();
         });
    
  2. 或者您也可以编写处理会话 cookie 滑动过期的中间件(过期时间可能会添加到 cookie 数据中),而不是默认的 Session 中间件。默认实现在这里

  3. 我不知道你在解决什么样的任务,但我认为以下配置就足够了:

     services.AddSession(options =>
     {
        options.IdleTimeout = TimeSpan.FromSeconds(10);
     });
    

它将在 10 秒内使您的会话数据失效(cookie 可能仍然存在),并为会话数据提供滑动到期。


推荐阅读