Firefox关闭后不会删除ASP.NET身份验证cookie

时间:2009-10-29 17:56:58

标签: c# asp.net firefox authentication cookies

开发一个小型Web应用程序,用于共享计算机。

当用户关闭浏览器窗口时,我希望删除会话和身份验证。

在“登录”页面中,我使用类似的方式对用户进行身份验证:

FormsAuthenticationTicket authTicket =
      new FormsAuthenticationTicket(1,txtUser.Text,
                                    DateTime.Now,
                                    DateTime.Now.AddMinutes(5),
                                    false,"");

string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
HttpContext.Current.Response.Cookies.Add(faCookie);
string redirectUrl = FormsAuthentication.GetRedirectUrl(txtUser.Text, false);
HttpContext.Current.Response.Redirect(redirectUrl);

如您所见,我已将“isPersistent”变量设置为false。

这似乎适用于Chrome(尚未在IE上测试),但是,当我在Firefox上运行应用程序时,激活了多个选项卡,如果我关闭浏览器并再次打开,我仍然进行身份验证,并且cookie是还在那里!

它真的很奇怪,因为关闭时应删除cookie ...当你打开多个标签时,这是Firefox的错误吗?我该如何解决这个问题?

非常感谢帮助!

提前致谢

7 个答案:

答案 0 :(得分:4)

您是关闭浏览器还是只关闭一个标签?您需要关闭整个浏览器。如果您打开了多个顶级浏览器窗口,则需要关闭所有这些窗口。此外,还需要关闭属于FireFox进程的任何其他窗口:下载,实时HTTP标头,查看页面源等。

答案 1 :(得分:2)

感谢提示小伙伴,但我确定我关闭了浏览器,没有打开任何与Firefox相关的窗口。

通过阅读this,这似乎是Firefox 3设计者选择的默认浏览器行为......

似乎它存储在存储在RAM上的磁盘cookie上,以便在再次打开浏览器时恢复选项卡。因此,如果要删除会话,则需要关闭所有选项卡,然后关闭浏览器...

我认为这会导致一些有关身份验证安全性的缺陷,例如,有人正在使用该应用程序,完成工作并通过关闭浏览器而不是选项卡离开。由于计算机是共享的,所以在另一个用户打开浏览器之后,他将看到所有选项卡,并恢复上一个会话......

答案 2 :(得分:1)

我建议您使用此代码删除Cookie,而不是依赖Mozilla或任何其他浏览器:

if (Request.Cookies["UserSettings"] != null)
{
    HttpCookie myCookie = new HttpCookie("UserSettings");
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    Response.Cookies.Add(myCookie);
}

有关此主题的更多信息:How to: Delete a Cookie

修改:

如果您想在页面卸载期间删除cookie,可以使用Javascript来完成:

<html>
<head>
  <title></title>
  <script type="text/javascript">
   function deleteCookie()
   {
     var d = new Date();
     document.cookie = "v0=1;expires=" + d.toGMTString() + ";" + ";";
     alert(document.cookie);
   }

  </script>
</head>

<body onunload="deleteCookie()">
...

</body>
</html>

我认为在您的情况下Javascript是最好的解决方案。

答案 3 :(得分:1)

不要使用cookies,使用会话来存储经过身份验证的用户,ASP.NET将为您管理会话cookie,它可以与FireFox配合使用,更安全。

但是如果您想继续使用此身份验证cookie,请将代码放在Global.asax Session_Start事件中。

protected void Session_Start(object sender, EventArgs e)
{
    HttpContext.Current.Request.Cookies.Remove(FormsAuthentication.FormsCookieName);
}

答案 4 :(得分:1)

问题源于这样一个事实,即如果你设置了一个过期,你将获得一个持久性cookie,以下代码适用于我,我希望用户在持久性或仅浏览器会话之间选择一个cookie“记住我“登录时的复选框:

 public void SetAuthenticationCookie(LoginView loginModel)
    {
      if (!loginModel.RememberMe)
      {
        FormsAuthentication.SetAuthCookie(loginModel.Email, false);
        return;
      }
      const int timeout = 2880; // Timeout is in minutes, 525600 = 365 days; 1 day = 1440.
      var ticket = new FormsAuthenticationTicket(loginModel.Email, loginModel.RememberMe, timeout);
      //ticket.
      string encrypted = FormsAuthentication.Encrypt(ticket);
      var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted)
        {
          Expires = System.DateTime.Now.AddMinutes(timeout),
          HttpOnly = true
        };
      HttpContext.Current.Response.Cookies.Add(cookie);
    }

答案 5 :(得分:0)

只是猜测:确保您还没有打开FireFox下载窗口......

答案 6 :(得分:0)

我找到了这个解决方案,可能对其他人有所帮助:

if (Request.Cookies["TownID"] != null)
{
       HttpCookie myCookie = Request.Cookies["TownID"];
       myCookie.Expires = DateTime.Now.AddDays(-1d);
       Response.Cookies.Add(myCookie);
}

来源:http://forums.asp.net/p/1565112/3895452.aspx