0

我今天有一个奇怪的问题要解决。客户需要他们的站点不允许人们登录、转到不同的站点,然后如果他们点击浏览器中的后退按钮仍处于登录状态。

我以为很简单……直到我找不到从另一个站点按下后退按钮时触发的页面事件。

我想只使用 JavaScript 并使用引用对象,但这不会实现我的目标,因为我需要访问 .NET 成员系统并将用户从他们的会话中注销。

有没有人解决这个问题?如果是这样,怎么做?任何帮助将不胜感激,可能我只是错过了我可以在 Global.asax 中实现的东西?如果有帮助,我正在使用 .NET 4.5 / C#。

推理:

因为,比如说,如果一个操作员去让他们的机器解锁,访问了谷歌,那么另一个操作员恶意地在同一台机器上点击返回按钮来访问该操作员的登录(客户端非常安全)

4

6 回答 6

1

因此,您想在用户离开您的网站时注销用户?你有全局 javascript,每分钟向服务器发送一个请求,说“嘿,服务器,我在这里!我是用户 Joe Blogs,我还在网站上”。如果服务器在一分钟内没有从用户那里收到此消息,请将其注销。

覆盖后退按钮是行不通的。如果用户打开另一个标签/窗口并在那里访问谷歌,你会怎么做?

更新:您可以尝试使用jquery 中的.unload()来捕捉页面离开。并销毁该事件的 cookie。

然而,当机器无人看管时,没有什么能阻止恶意用户去抢夺访问权限。

更新 2您可以设置非常短的会话寿命!如果用户处于非活动状态(或离开页面) - 将其注销。为了防止用户在屏幕上看太久(填写很长的表格)时注销可能引起的烦恼 - 使 javascript 定期(每 5 分钟)到服务器到一个虚拟页面 - 以在页面保持会话活跃已加载。

这里是来源:强制用户在离开我的 php 网站时注销?

于 2012-10-09T12:34:01.330 回答
1

这个问题可能有一个“神奇”的解决方案,但这里的关键在于推理:不允许操作员 A 使用具有操作员 B 的凭据的站点。

从客户端和服务器的角度来看,服务器或客户端(浏览器)无法告诉人们在任何时候更换了座位。

这就是你必须解决的问题。

但也许实现人脸检测有点过头了?

于 2012-10-09T13:11:06.730 回答
1

如果您是从头开始设计站点,则可以通过添加标头来指定您不想要缓存来做到这一点。

Cache-Control: no-cache Pragma: no-cache

但是您必须通过单个页面访问所有站点。页面不必显示相同,可以包含不同的控件等,但它的内容将由 POST 参数决定,而不是通过正常的 ASP.NET 模型。

例如Default.aspx,要导航,您将至少返回两个参数。一个是要导航到的页面,另一个是不可预测的标记。

例如Token=3Zd2f4O61Z&Page=OrderHistory

在每个页面加载时,您将验证令牌和页面标题组合,如果确定,您将显示页面并为您希望用户在此时执行的任何导航或操作生成新的回发数据链接。如果用户尝试使用旧令牌访问同一页面,它将使会话过期,然后注销用户。这是最安全的方法,因为单击后退按钮会提示用户再次重新提交他们的帖子数据。如果单击“确定”,浏览器将提交它,但服务器会识别出该令牌现在无效(因为它已被使用,并被服务器丢弃),然后注销用户。

此方法还可以防止 CSRF,因为您正在验证每个请求的有效负载中的令牌,而不仅仅是检查 cookie 值。

我知道这对你没有帮助,除非你可以重新设计你的网站,但我想我会添加这个解决方案,以防有人从一开始就有这个要求。

于 2012-10-10T14:20:01.557 回答
0

您可以通过 JS 重定向到真实主页,使您的网站的登录页面不包含任何内容,这样当人们点击返回按钮时,他将首先返回到将他移回主页的重定向页面。

但是,如果用户选择一次跳过几页或只是打开另一个窗口,则可以覆盖它。

于 2012-10-09T12:24:11.173 回答
0

您能否提供有关为什么需要它的更多信息?我认为在您的情况下,有一个可能的解决方案可能是使用单独的数据库表或字段来标记或标记已重定向到另一个站点的此类用户,只需将他们视为已注销,然后一旦他们点击您的站点 URL,您就可以可能会自动检查标志并重新登录。

于 2012-10-09T12:30:48.160 回答
0

JQueryunload()函数将像 javascript 一样解决您的问题window.onbeforeunload...

于 2012-10-09T12:48:25.730 回答