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

时间:2009-03-18 22:23:20

标签: asp.net security forms-authentication

我们有一个场景,我们希望检测用户何时离开我们的网站并立即使他们的.Net会话到期。我们正在使用表单身份验证。我们不是在谈论我们已经拥有的会话超时。我们想知道用户何时浏览我们的网站,通过链接,输入地址或关注书签。如果他们回到我们的网站,即使立即,他们将不得不重新登录(我知道这不是很好的可用性 - 这是我们客户提供的安全要求)。

我最初的直觉是,这是不可能的,或者任何解决方案都非常不可靠。我们提出的唯一解决方案是:

  • 添加一个JavaScript onBlur事件处理程序,告诉服务器在用户离开站点时注销会话。
  • 用户登录后,请检查HTTP引荐来源以确保用户已从网站内导航。
  • 将AJAX轮询添加回服务器以保持会话刷新,可能间隔为10秒。如果没有按时收到电话,会话就会结束。

onBlur似乎是最简单但可能最不可靠的方法 - 我不确定它是否会起作用。引用方法也存在问题,因为用户可以在站点内键入地址而不是链接。 AJAX方法似乎可行,但它很复杂 - 我甚至不确定如何在后端处理它。我想也可能会有一些情况不会一直有效。

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果用户关闭浏览器或输入其他网址(包括选择收藏),则无法检测到。

对于您网站上的链接,您可以创建通过您的网站转发的链接(即,而不是链接到您链接到http://example.com/foohttp://mysite.com/forwarder?dest=http://example.com/foo)。

请注意只转发到您打算使用的网站,否则您可以通过“通用转发”用于网络钓鱼等来解决安全问题。

答案 2 :(得分:0)

你绝对需要告诉客户这是不可能的。他们对网络的运作方式存在基本的误解。外交,显然......地狱,这可能是别人的工作......但是需要做。

你的建议或它们的组合可以在一个简单的概念验证中起作用......但它们只能为你带来支持噩梦,并且不能始终如一地运作。更糟糕的是,您无疑会创建用户根本无法使用该应用程序的情况,因为安全漏洞会使他们失误。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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