Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当用户离开网站时,如何强制ASP.Net会话过期?_Asp.net_Security_Forms Authentication - Fatal编程技术网

当用户离开网站时,如何强制ASP.Net会话过期?

当用户离开网站时,如何强制ASP.Net会话过期?,asp.net,security,forms-authentication,Asp.net,Security,Forms Authentication,我们有一个场景,在这个场景中,我们希望检测用户何时离开我们的站点并立即终止他们的.Net会话。我们正在使用表单身份验证。我们不是在讨论会话超时,我们已经有了。我们想知道用户何时通过链接、键入地址或跟随书签浏览我们的网站。如果他们返回我们的网站,即使是马上,他们也必须重新登录(我知道这不是很好的可用性-这是我们的客户给我们的安全要求) 我最初的直觉是,这要么是不可能的,要么是任何解决方案都极不可靠。我们提出的唯一解决方案是: 添加一个JavaScript onBlur事件处理程序,当用户离开站点

我们有一个场景,在这个场景中,我们希望检测用户何时离开我们的站点并立即终止他们的.Net会话。我们正在使用表单身份验证。我们不是在讨论会话超时,我们已经有了。我们想知道用户何时通过链接、键入地址或跟随书签浏览我们的网站。如果他们返回我们的网站,即使是马上,他们也必须重新登录(我知道这不是很好的可用性-这是我们的客户给我们的安全要求)

我最初的直觉是,这要么是不可能的,要么是任何解决方案都极不可靠。我们提出的唯一解决方案是:

  • 添加一个JavaScript onBlur事件处理程序,当用户离开站点时通知服务器注销会话
  • 用户登录后,请检查HTTP Referer以确保用户已从站点内导航
  • 将AJAX轮询添加回服务器以保持会话刷新,可能每隔10秒。如果没有按时收到呼叫,会话将结束
onBlur似乎是最简单,但可能最不可靠的方法——我不确定它是否会起作用。referer方法也存在问题,因为用户可以在站点中键入地址,而不跟随链接。AJAX方法似乎可以工作,但它很复杂——我甚至不知道如何在后端处理它。我在想,在某些情况下,这可能并不总是可行的


任何想法都将不胜感激。谢谢。

如果用户关闭浏览器,或键入不同的URL(包括选择收藏夹),您将无法检测到太多内容

对于站点上的链接,您可以创建通过站点转发的链接(即,而不是链接到您的链接)


只需注意只转发到您打算转发的站点,否则您可能会因“通用转发”被用于网络钓鱼等而引发安全问题。

我选择了您上面描述的心跳类型场景。Ajax轮询或IFRAME。当用户关闭浏览器并经过某个超时(10秒?)时,您可以将其注销


另一种选择是让站点完全在AJAX上运行。因此,用户只能访问一个“URL”,所有内容都是动态加载的。当然,你用这种方式打破了各种可用性,但至少你实现了你的目标。

你绝对需要积极地告诉客户这是不可能的。他们对网络的工作原理有一个基本的误解。显然,要有外交手腕。。。见鬼,这可能是别人的工作。。。但这是必须做到的


您的建议,或它们的组合,可能在一个简单的概念证明中起作用。。。但它们只会给你带来噩梦,而且不会持续足够的工作。更糟糕的是,毫无疑问,您也会造成用户无法使用应用程序的情况,因为安全黑客在他们身上不起作用。

Javascript有一个onUnload事件,当浏览器被告知离开页面时会触发该事件。当您在编辑答案时尝试按后退按钮或单击链接时,可以在StackOverflow上看到这一点

您可以使用此事件触发站点的自动注销


但是,我不确定这是否能处理浏览器被故意关闭或浏览器进程被外部终止的情况(我猜在第二种情况下不会发生这种情况)。

如果站点内的所有导航都是通过.NET回发完成的(没有简单的html链接或javascript打开语句),如果页面加载不是回发,则可以自动注销并重定向到登录页面。这不会在退出时结束会话,但看起来是这样的,因为如果手动导航到您的web应用程序,它会强制登录。要为所有页面获取此功能,可以使用母版页在页面加载中执行此操作

private void Page_Load(object sender, System.EventArgs e)
{
    if (!IsPostBack)
    {
        System.Web.Security.FormsAuthentication.SignOut();
        System.Web.Security.FormsAuthentication.RedirectToLoginPage();
    }
}

您是否使用ASP.Net应用程序完成了此操作?您如何知道在后端轮询没有发出呼叫?换句话说,如果根据定义没有发出请求,您如何为此设置侦听器?我们有一个对象将会话ID映射到上次收到的轮询时间。无论何时提出页面请求,我们都会获得最后一次投票时间。如果太旧或没有条目,我们会将其注销。我们会定期(每隔几分钟)清除字典中的旧条目。不幸的是,这并不总是能够口述给客户。我们有一个客户在投标政府合同。这是合同上的一项要求。现任竞争对手已经声称(从未证实)能够做到这一点。因此,我们真的别无选择,只能尝试实施一些措施。显然,客户对现任员工不满意,否则你就得不到这份工作。:)