在浏览器关闭时确保表单身份验证注销

时间:2014-09-21 14:20:43

标签: c# asp.net c web-applications

我的asp.net网络应用程序和Chrome存在问题。当我关闭Chrome浏览器窗口时,它不会清除Cookie。这意味着如果我使用表单身份验证登录我的Web应用程序,然后关闭并重新打开浏览器窗口,则表明我仍然登录!

我读到这可能是Chrome错误,但必须有一些解决方法。

我发现了this帖子,并希望在浏览器窗口关闭时运行以下代码:

FormsAuthentication.SignOut();
Session.Abandon();

// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);

// clear session cookie (not necessary for your current problem but i would recommend you do it anyway)
HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);

我的问题是,是否有一个浏览器关闭的事件处理程序,我可以在我的代码中的某处指定?可能是Global.aspx文件中的Application_End?或者这不是它的意思?

还是有另一种方法可以解决这个问题吗?

谢谢。

以下是我的代码:

private void Login_Click(Object sender, EventArgs e)
  {
    // Create a custom FormsAuthenticationTicket containing
    // application specific data for the user.

    string username     = UserNameTextBox.Text;
    string password     = UserPassTextBox.Text;
    bool   isPersistent = false;

    if (Membership.ValidateUser(username, password))
    {
      string userData = "ApplicationSpecific data for this user.";

      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
        username,
        DateTime.Now,
        DateTime.Now.AddMinutes(30),
        isPersistent,
        userData,
        FormsAuthentication.FormsCookiePath);

      // Encrypt the ticket.
      string encTicket = FormsAuthentication.Encrypt(ticket);

      // Create the cookie.
      Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

      // Redirect back to original URL.
      Response.Redirect(FormsAuthentication.GetRedirectUrl(username, isPersistent));
    }
    else
    {
      Msg.Text = "Login failed. Please check your user name and password and try again.";
    }
  }

默认情况下,仅将isPersistent替换为checkbox.Checkedfalse

编辑:

可能发生的另一件令人讨厌的事情是来自[this]链接,其中最佳答案是:

您使用哪种浏览器也很重要。 Chrome可以在后台运行,并且可以使会话Cookie保持不变,直到超时达到 - 当浏览器关闭时它们不会被删除(我发现这很难)。

2

1 个答案:

答案 0 :(得分:2)

没有浏览器关闭处理程序,怎么会有?页面完成后,连接将关闭。你不知道用户是否浏览了网站,关闭了浏览器,还是让它在那里待了一天。您必须使用客户端代码来调用服务来处理这个问题,并且执行此操作的客户端代码不够可靠,无法使其无效。

设置身份验证Cookie时,请确保持久性选项为false。

此外,当您关闭浏览器时,请确保关闭所有浏览器窗口。如果您有多个浏览器窗口,它们将共享相同的cookie缓存,因此会话cookie之类的东西仍然存在,并且让您相信当服务器真正是浏览器时,身份验证将保持活动状态。