【发布时间】:2012-09-12 19:36:40
【问题描述】:
我有一个简单的小问题,但是下面的内容很长,可以进一步解释这个问题。
我有一个使用表单身份验证的 MVC 4 应用程序。我使用浏览器会话 cookie 进行了设置,以便他们可以根据需要使用该网站,但是一旦他们关闭浏览器,它实际上就会将其注销。
现在我以空闲计时器的形式添加了额外的安全层,因此如果它们空闲了 5 分钟,则会向服务器发送一个 ajax 请求以删除表单身份验证令牌,返回一个会话过期部分视图,并将此会话过期视图显示为模式对话框。
此对话框有一个显示用户名的标签和一个密码输入字段,以便他们可以重新输入密码。
这意味着如果有人打开另一个会话,他们只会进入登录屏幕,因为没有人登录,如果他们只是刷新当前屏幕,也会发生同样的情况。但这也意味着,如果用户在超时屏幕上输入密码,对话框会向服务器发送一个 ajax 请求以再次登录,然后删除对话框。
这一切(大部分)都完美无缺,它们将与以前一样在同一个屏幕上,并且它们还将像以前一样填写所有内容,例如,如果他们正在填写一张大表格等.
问题是,如果他们在浏览器中打开了 2 个不同的标签,第一个超时,按预期显示超时屏幕及其名称和密码输入框,但第二个浏览器当它向 mvc 方法发出超时屏幕请求时,选项卡没有找到已登录的用户,因为没有人登录,因为该人在第一次超时请求时已注销。我怎样才能解决这个问题?有简单的解决方案吗?还是有更好的设计来解决我的问题?
【问题讨论】:
-
那么,当秒屏发现没有会话时,它可以再次显示您的对话框,之后它可以定期检查会话是否返回,然后再次关闭对话框?
-
但是说为了说话,用户有 2 个屏幕,1 个主屏幕打开,另一个屏幕他们忘记了......他们忘记了超时的屏幕,将它们注销,并显示时间-退出对话框,然后他们正在处理的主屏幕发出相同的超时请求,没有登录用户,并且该屏幕对他们尝试重新登录没有用
-
我通常通过跟踪用户在服务器端的活动来解决这个问题,所以当来自客户端的“超时”调用进来时,我们检查用户最后一次操作是什么时候(存储在 fx 会话中),如果它小于五分钟他必须在另一个屏幕上做某事,我们告诉客户不要让他超时并“给我们回电话”,看看我们是否应该在那个时候让他超时
-
什么是“外汇会话”?我认为无论如何,使用您的解决方案会发生相同的最终结果,您打开了 2 个选项卡,将它们都放置 10 分钟,其中一个会正确超时,另一个不会因为用户已注销。
-
miracledev 的场景是有道理的。在您注销用户之前,请检查“LastActivityDate/LastLoginDate”列。
标签: asp.net asp.net-mvc forms-authentication