Файл cookie аутентификации ASP.NET не удаляется после закрытия Firefox - PullRequest
5 голосов
/ 29 октября 2009

Я разрабатываю небольшую веб-заявку, используемую на общем компьютере.

Когда пользователь закрывает окно браузера, я хочу удалить сеанс и аутентификацию.

На странице входа я использую что-то подобное для аутентификации пользователя:

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 все еще там!

Это действительно странно, потому что куки должны быть удалены при закрытии ... Это ошибка в Firefox, когда у вас открыто несколько вкладок? Как я могу это исправить?

Помощь очень ценится!

Заранее спасибо

Ответы [ 7 ]

4 голосов
/ 29 октября 2009

Вы закрываете браузер или только одну вкладку? Вам необходимо закрыть весь браузер. Если у вас открыто несколько окон браузера верхнего уровня, все они должны быть закрыты. Кроме того, любые другие окна, которые являются частью процесса FireFox, также должны быть закрыты: загрузки, прямые HTTP-заголовки, просмотр исходного кода страницы и т. Д.

2 голосов
/ 29 октября 2009

Спасибо за советы, ребята, но я уверен, что я закрываю браузер, не открывая больше связанных с Firefox окон.

Читая это , кажется, что это поведение браузера по умолчанию, выбранное дизайнерами Firefox 3 ...

Кажется, он сохраняет на диске файлы cookie, предназначенные для хранения в ОЗУ, для восстановления вкладок при повторном открытии браузера. Поэтому, если вы хотите удалить сеанс, вам нужно закрыть все вкладки, а затем браузер ...

Я думаю, что это может вызвать некоторые недостатки в безопасности аутентификации, например, кто-то использует приложение, завершает работу и уходит, закрывая браузер, а не вкладки. Поскольку компьютер является общим, сразу после того, как другой пользователь откроет браузер, и он увидит все вкладки, с восстановленным предыдущим сеансом ...

1 голос
/ 16 октября 2012

Проблема связана с тем фактом, что если вы установите срок действия, вы получите постоянный файл 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);
    }
1 голос
/ 29 октября 2009

Не используйте файлы cookie, используйте сеанс для хранения аутентифицированного пользователя, и ASP.NET будет управлять файлом cookie сеанса для вас, он работает с FireFox и более безопасен.

Но если вы хотите продолжить использовать этот файл аутентификации, поместите код для его удаления в событие Global.asax Session_Start.

protected void Session_Start(object sender, EventArgs e)
{
    HttpContext.Current.Request.Cookies.Remove(FormsAuthentication.FormsCookieName);
}
1 голос
/ 29 октября 2009

Вместо того, чтобы полагаться на Mozilla или любые другие браузеры, я бы порекомендовал вам использовать этот код для удаления файлов cookie:

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

Для получения дополнительной информации по этой теме: Как: удалить куки

Редактировать:

Если вы хотите удалить куки во время выгрузки страницы, вы можете использовать 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 - лучшее решение.

0 голосов
/ 01 декабря 2013

Ну, я нашел это решение, может помочь кому-то еще:

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

0 голосов
/ 29 октября 2009

Просто дикая догадка: убедитесь, что у вас еще не открыто окно загрузок FireFox ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...