【问题标题】:Capture Session timeout on Server side in asp.net core 2.1在 asp.net core 2.1 中的服务器端捕获会话超时
【发布时间】:2018-11-07 13:42:02
【问题描述】:

我需要在 Session End 事件上做点什么。 如何访问此活动? 与此事件类似的任何事情都可能超时?

【问题讨论】:

    标签: asp.net-core-2.1


    【解决方案1】:

    ASP.NET 有一个Session_OnEnd 事件,您可以在 Global.asax 中注册,但即便如此,它也非常不可靠:您只能将它与进程内会话一起使用,并且它只能监视会话到期,而不是当用户执行诸如关闭浏览器窗口之类的操作。

    不过,ASP.NET Core 没有类似的东西,主要是因为它真的没有意义。最重要的是,ASP.NET Core 是为扩展而设计的,进程内的 anything 是其对立面。会话存储是默认分发的。即使您确实使用内存中的会话,它仍然使用IDistributedCache 的实现。拥有分布式会话存储会导致无法监控过期,因此尚未添加此类功能。

    更重要的是,会话不会主动过期。相反,当用户下一次发回会话 cookie 时,在允许会话过期后,会话被销毁并创建一个新会话。会话也采用滑动过期,因此只要用户在超时窗口内保持活动状态,会话就不会过期。

    长短不一,你要找的东西是不可能的。但是,这确实会引起 XY 问题。您有某种需要解决的问题 (X),并且您已决定解决它的方法是在会话到期 (Y) 时做一些事情。但是,您也无法弄清楚如何做 Y,所以您问的是关于 Y 的问题,而实际上您应该问的是 X。我建议创建一个关于 实际 的新问题> 您需要解决的问题;可能有更好的方法。

    【讨论】:

    • 实际问题:我们想为正在添加课程的用户记录会话何时结束。我们只允许他们有 70 分钟的会话超时时间来附加 .PDF 文档。实际解决方案:这样可以避免整日整夜的恶意活动。如果会话时间结束并且他们没有点击“我完成了”或“我不需要添加文档”,那么我们需要知道发生了什么。捕获特定用户的超时事件让我们知道他们关闭了浏览器或等待了太长时间。
    【解决方案2】:

    ASP.NET Core 中处理此问题的唯一方法 - 在客户端的页面加载(在JS 代码中)安排会话超时计时器并在接近到期时警告用户。如果用户响应 - ping 服务器端(刷新会话),或将用户重定向到注销页面。您的会话超时可以在Startup 类中配置。因此,您需要将相同的值传递给客户端视图,设置一个计时器(假设是 20 分钟)以在 19 分钟后向用户显示模式,并带有倒计时一分钟的计时器和一个像“保持在线”这样的按钮。当用户单击按钮时 - 对服务器端执行 AJAX 调用(Home 控制器中的一些 Ping 操作,或类似的东西)。

    【讨论】:

    • 这就是我的想法,但我试图找到另一种更好的方法。它已经在工作了。 @德米特里
    • 是的,我也在努力寻找更好的方法 :) 但我没有找到 ASP.NET Core
    • 你不一定指望 JS 可用或启用。如果您只是想添加渐进式增强,这很好,例如在填写多步骤表单时帮助用户知道他们的会话即将到期。但是,您不能依靠来处理必须做的事情。
    • @ChrisPratt 是的,我们无法回复。最坏的情况(禁用 JS)将是用户在会话到期后尝试执行任何操作时重定向到登录页面。
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2020-07-23
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2020-02-26
    相关资源
    最近更新 更多