【问题标题】:Asp net core 3.1 Session never expiresasp net core 3.1 Session永不过期
【发布时间】:2020-09-04 00:15:30
【问题描述】:

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

我试过了:

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

在旧的 AspNet MVC 中非常简单/琐碎 - 立即按预期工作。

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

有什么想法吗?

编辑:Cookies

 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:

【问题讨论】:

  • 能否在浏览器中提供会话 cookie 属性
  • 是的,我会的,明天。
  • 我的意思是来自开发者工具的属性![enter image description here](i.stack.imgur.com/A1tYP.png)
  • 经过一些测试后,该会话通常会在(默认)20 分钟后过期。我只是无法更改默认时间(20 分钟)。

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


【解决方案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 中间件。默认实现是here

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

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

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

【讨论】:

  • 我添加了 cookie 过期信息的屏幕截图。
  • 如本答案代码块中所述,当您未设置 options.Cookie.MaxAge 时,您的 cookie 将是 Session(图片中的第 5 列)。只有在您关闭浏览器时它才会过期(我在使用 opera 时遇到了一些问题)。如果您将设置 options.Cookie.MaxAge = TimeSpan.FromSeconds(10); - 它将在 10 秒后过期。但是,如果您重复使用会话数据的查询,则会设置新的 cookie。如果 cookie 过期,请在开发工具中使用以下配置和跟踪:``` services.AddSession(options => { options.Cookie.MaxAge = TimeSpan.FromSeconds(1); });
  • 至于方法 ConfigureApplicationCookie - 它只会影响身份验证 cookie
  • 感谢您的想法。我试试看!
  • IInar,设置 MaxAge 有效,但滑动过期无效?即使我在 MaxAge 过期时间跨度期间读/写会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2020-04-03
  • 2020-05-22
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多