【问题标题】:ASP.NET authentication cookie not deleting after Firefox is closedFirefox 关闭后 ASP.NET 身份验证 cookie 未删除
【发布时间】:2010-12-11 08:33:22
【问题描述】:

我正在开发一个小型网络应用程序,用于共享计算机。

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

在登录页面中,我使用类似这样的方式来验证用户身份:

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 的错误,当您打开多个标签时?我该如何解决这个问题?

非常感谢您的帮助!

提前致谢

【问题讨论】:

    标签: c# asp.net firefox authentication cookies


    【解决方案1】:

    只是一个疯狂的猜测:确保您还没有打开 FireFox 下载窗口...

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我建议您使用此代码删除 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 是最好的解决方案。

        【讨论】:

        • 我该把代码放在哪里?因为我想在用户关闭窗口时删除它,而我没有找到任何处理程序。
        • @Tom S. :根据您的问题,我已经更改了答案。希望对您有所帮助。
        • 每次单击链接以转到门户中的另一个页面时,这是否也会删除会话 cookie?本质上是强迫他们在每个页面上一次又一次地登录?汤姆只希望在他们关闭我认为无法检测到的浏览器时发生这种情况。
        【解决方案4】:

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

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

        似乎它存储在磁盘上的 cookie 应该存储在 RAM 上,以便在您再次打开浏览器时恢复选项卡。所以如果要删除session,需要关闭所有标签页,然后浏览器...

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

        【讨论】:

        • 10 年后它似乎仍然是一个问题,如果我至少有一个私人标签打开,cookie 不会被删除,我不明白他们为什么要这样设计。跨度>
        【解决方案5】:

        不要使用 cookie,使用 session 来存储认证用户,ASP.NET 会为你管理 session cookie,它可以与 FireFox 一起使用,并且更安全。

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

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

        【讨论】:

        • 好主意,在会话开始时将其删除!但是为什么使用 session 更好呢?以及如何在会话中存储经过身份验证的用户?我使用来自 ASP.NET 的身份验证系统,在 web.config 中定义此标记:
        • 这实际上不起作用,因为如果您不关闭特定选项卡,ASP.NET 会话不会在 Mozilla 中结束。如果您关闭窗口而不关闭选项卡,会话仍处于激活状态。
        【解决方案6】:

        问题源于这样一个事实,即如果您设置了过期时间,您将获得一个持久性 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);
            }
        

        【讨论】:

          【解决方案7】:

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

          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

          【讨论】:

            猜你喜欢
            • 2016-05-30
            • 2011-03-07
            • 1970-01-01
            • 2012-06-10
            • 2017-10-22
            • 2011-08-19
            • 2012-02-08
            • 1970-01-01
            • 2011-02-28
            相关资源
            最近更新 更多