跟踪会话和表单身份验证在服务器上保留到期时间

Iva*_*dov 5 c# asp.net session

背景:

回到工作中,我正在开发一个Web窗体应用程序,它使用Session和FormsAuthentication超时的默认,滑动过期.我的任务是跟踪用户活动和,如果需要的话,显示模式窗口与有关会话过期,定时器和一个按钮警告刷新会话超时(这将刷新窗体身份验证超时也).按钮连接到主页面上具有空体的事件,它现在可以完成工作.(我知道其他解决方案).

部分工作解决方案:

我的方法是使用母版页面Page_PreRender方法来获取Session和FormsAuthentication超时值,比较它们并将较小(或任何)值传递给客户端的浏览器(带有其他必要的数据).在浏览器中,我会在模态窗口的某个特定时刻显示带有计时器的警告,并且它将按预期工作......即...当用户什么都不做时.

问题:

我们的应用程序有很多页面都有更新面板.这些更新面板用于与Session中存储的数据进行交互和操作.每当用户在其中一个更新面板中执行某些操作时,会话超时就会滑动(重新启动).我无法在客户端(在现实世界中)跟踪这些事情,我需要一种方法来跟踪服务器上的会话过期.

我不想做的事情

我不想要浏览每一个页面,每个网格视图,每个图像按钮等,并绑定一些客户端事件来跟踪用户操作.如果可能的话,我想要更多......通用和可维护的解决方案

我的想法:

我希望能够在到期之前跟踪/检查Session或FormsAuthentication剩余时间,或者在这些值已被重置时得到通知.这样我就可以在客户端上获得关于我应该在显示模态窗口时发出警告的时刻的初始数据,那时我希望能够先检查服务器,如果时间合适(大约)或者我是否应该在客户端上更新我的javascript数据并在显示警告窗口之前延长时间,因为会话到期已经更新...那么拦截和过滤用户请求呢?那会有帮助吗?

Iva*_*dov 0

首先,感谢大家的建议。我上周已经成功解决了这个问题,只是没有时间提前发布......坦率地说,我对其他解决方案感兴趣。我将确保阅读您发布和建议的所有材料。谢谢你。

这就是我所做的:

在服务器端:

我使用 cookie 来跟踪会话过期时间。我忽略的一件事是,即使在异步请求上,Page 也会经历其整个生命周期。整个想法是使用母版页的 Pre_Render 事件为每个请求设置适当的 cookie。

我使用 UTC 时间格式并计算可转换为 javascript 时间格式的毫秒:

 var tmpDate = new DateTime(1970, 1, 1);
 var nowUtc = DateTime.UtcNow;
 var tmpSpan = new TimeSpan(nowUtc.Ticks - tmpDate.Ticks);
 return tmpSpan.TotalMilliseconds;
Run Code Online (Sandbox Code Playgroud)

有了这个,我就拥有了计算所需的一切,当前时间、会话过期(Session.Timeout)时间和警告时间......来自那里的基本数学。

在客户端:

首先,我红色了所有三个 cookie 以开始跟踪并初始化了两个单独的变量来跟踪当前服务器时间。它们都被初始化为当前服务器时间的第一个 cookie 读取的相同值。然后,我使用setTimeout函数每秒读取 cookie(当前服务器时间)(jQuery 插件)。我正在检查从前一个 cookie 读取的当前服务器时间和从最新cookie 读取的当前服务器时间是否相等(单独的变量) - 这样我就知道是否有任何请求,如果有,我会读取另外 2 个 cookie 以获取警告时间以及更新内容并关闭警告对话框(如果已打开)的超时时间。之后,我将使当前服务器时间变量相等,并在每次读取 cookie 后继续比较它们,并仅更新其中一个。另外,在每次 setTimeout 调用中,我都会获取当前时间

new Date().getTime();
Run Code Online (Sandbox Code Playgroud)

它返回在客户端计算机上测量的当前 UTC 时间。无论如何,我们都假设客户在他/她的机器上设置了有效的时钟。之后,我将当前时间与警告时间进行比较,如果当前时间“大于”警告时间并且“小于”超时时间,那么我们必须显示弹出窗口。如果当前时间“大于”超时时间,请单击不可见按钮,该按钮调用注销用户后面的母版页代码中的方法。即使用户在浏览器中打开了多个选项卡,这也非常有效。一旦用户在一个选项卡中注销,尝试将其注销的所有其他页面(选项卡)也会被重定向到登录页面。如果用户单击“确定”按钮确认他/她的存在,则会触发母版页代码后面的空事件(单击隐藏的 asp 按钮)。这足以刷新会话。这将自动重新发送 cookie,一切都会按预期进行。(假设您有滑动会话)。在警告窗口中实现计时器很容易。我已经为带有消息和 3 个跨度的模态窗口动态创建了 div。在每次 setTimeout 迭代中,我都像这样设置计时器:

  1. 从当前 javascript 时间计算小时、分钟、秒
  2. 将结果放入变量中
  3. 如果结果小于 10,则在前面添加 0(零)
  4. 按类定位适当的范围(IE 8 中的 ID 存在问题,使用唯一类)并将其文本属性设置为计算值 $(obj).text(calculatedValue)

为了最后

请确保,当您读取 cookie 将其解析为浮点数时,只是为了确定一下。我有兴趣了解服务器推送技术的应用以及 Web 套接字在这种特殊情况下的使用,但我认为如果您在服务器上为每个客户端跟踪和计算会话过期时间,这将是一种矫枉过正的做法。我知道我已经要求在服务器上进行会话过期跟踪,这看起来像在客户端上进行跟踪,但事实并非如此...这些 cookie 是我们跟踪所需的全部内容,它们来自服务器,所以...就是这样。