为什么Asp.Net Session.Clear()在看到它运行时在关闭选项卡上工作?

时间:2013-04-29 15:17:21

标签: asp.net security session webforms

当一个标签针对主管和其他人使用的工作区系统关闭时,我一直试图从会话中彻底休息。当这个人退出时我很成功 - 一切都被清除了。但是,当一个选项卡关闭时,它可以随意重新打开,就像从未调用session.clear()一样。

我正在使用这个javascript:

 $.ajax({
    type: "POST",
    url: "default.aspx/EndSession",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) { }
 });

调用此Web方法:

[WebMethod]
public static string EndSession()
{
   HttpContext.Current.Session.Clear();
   HttpContext.Current.Session.Abandon();
   HttpContext.Current.User = null;
   FormsAuthentication.SignOut();
   return "";
}

我设置了一个断点,并在我单步执行时观察代码执行并返回。选项卡关闭,然后我右键单击并选择“重新打开关闭选项卡”,页面返回,会话仍处于活动状态。

我看到here ppl说这是不可能的,但是不明白为什么,因为代码在服务器上运行 - 我正在看它运行,并且会话没有被清除。我原以为这是对“Session.Clear()”和“Session.Abandon()”的显式调用。注销Page_Load中的相同代码效果很好。

为什么呢?我错过了什么?运行后是否会清除会话,因为选项卡已关闭?

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试将Session.RemoveAll();redirect添加到其他页面吗?

public static string EndSession()
{
   HttpContext.Current.Session.Clear();
   HttpContext.Current.Session.Abandon();
   HttpContext.Current.Session.RemoveAll();
   HttpContext.Response.Redirect("~/login.aspx", true);
   HttpContext.Current.User = null;
   FormsAuthentication.SignOut();
   return "";
}


除了上面的代码,在Page_Load上添加:

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoServerCaching();
HttpContext.Current.Response.Cache.SetNoStore();

我不是百分之百确定它会起作用,我想写下来希望它可以提供一些帮助。