2009-10-29 10 views
5

Zajmuję się tworzeniem niewielkiej aplikacji internetowej używanej we wspólnym komputerze.Nie można usunąć pliku cookie służącego do uwierzytelniania ASP.NET po zamknięciu przeglądarki Firefox

Gdy użytkownik zamyka okno przeglądarki, chcę, aby sesja i uwierzytelnienie zostały usunięte.

Na stronie logowania używam coś takiego uwierzytelnienia użytkownika:

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); 

Jak widać, mam ustawić zmienną „isPersistent” false.

To wydaje się działać w Chrome (nie testowałem na IE), jednak gdy uruchomię aplikację w przeglądarce Firefox z włączonymi wieloma kartami, jeśli zamknę przeglądarkę i ponownie ją otworzę, nadal będę uwierzytelniana, a plik cookie wciąż tam jest!

To naprawdę dziwne, bo ciasteczko powinno zostać usunięte po zamknięciu ... Czy to błąd z Firefoksa, kiedy masz otwarte wiele zakładek? Jak mogę to naprawić?

Pomoc jest doceniana!

góry dzięki

Odpowiedz

0

Dziękuję za porady, ale jestem pewien, że zamknę przeglądarkę, bez otwierania okien związanych z Firefoksem.

Czytając this, wydaje się, że jest to zachowanie domyślne przeglądarki, wybrałem przez projektantów Firefox 3 ...

Wydaje przechowuje pliki cookie na dysku suposed być przechowywane w pamięci RAM, w celu odzyskania zaczepy kiedy ponownie otworzysz przeglądarkę. Jeśli chcesz usunąć sesję, musisz zamknąć wszystkie karty, a następnie przeglądarkę ...

Myślę, że może to spowodować pewne błędy w zakresie bezpieczeństwa uwierzytelniania, na przykład ktoś korzysta z aplikacji, praca i pozostawia, zamykając przeglądarkę, a nie karty. Ponieważ komputer jest udostępniany, zaraz po otwarciu przeglądarki przez innego użytkownika, zobaczy wszystkie karty z poprzednią sesją przywróconą ...

0

Tylko dzikie przypuszczenie: upewnij się, że nie masz okna Firefoksa Pobieranie nadal otwarte ...

4

Czy zamykając przeglądarkę, czy tylko jedną kartę? Musisz zamknąć całą przeglądarkę. Jeśli masz wiele otwartych okien przeglądarki najwyższego poziomu, wszystkie muszą zostać zamknięte. Również inne okna wchodzące w skład procesu FireFox również muszą zostać zamknięte: Pobieranie, aktywne nagłówki HTTP, wyświetlanie źródła strony itp.

2

Zamiast polegać na Mozilli lub dowolnej innej przeglądarce, polecam użyć tego kodu, aby usunąć pliki cookies:

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

aby uzyskać więcej informacji dotyczących tego tematu: How to: Delete a Cookie

Edit:

Jeśli chcesz usunąć ciasteczka podczas rozładowywania strony, możesz użyć Javascript, aby to osiągnąć:

<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> 

Myślę, że w twojej sytuacji Javascript jest najlepszym rozwiązaniem.

+0

Gdzie mogę umieścić ten kod? Ponieważ chcę go usunąć, gdy użytkownik zamyka okno, i nie znajduję dla niego żadnego programu obsługi. –

+0

@ Tom S.: Zgodnie z twoim pytaniem zmieniłem odpowiedź. Mam nadzieję, że to pomoże. – Tarik

+0

Czy to też nie usunie cookie sesji za każdym razem, gdy klikniesz na link, aby przejść do innej strony w portalu? Zasadniczo zmuszając ich do ponownego logowania się na każdej stronie? Tom chce, żeby tak się stało, jeśli zamkną przeglądarkę, której nie można wykryć. – EdenMachine

1

Nie używaj ciasteczek, używaj sesji do przechowywania uwierzytelnionego użytkownika, a ASP.NET będzie zarządzał plikiem cookie sesji, działa z FireFox i jest bezpieczniejszy.

Ale jeśli chcesz kontynuować ten plik cookie uwierzytelniania, umieść kod, aby usunąć go w wydaniu Global.asax Session_Start.

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

Świetne idei, usuwając je, gdy rozpocznie się sesja! Ale dlaczego korzystanie z sesji jest lepsze? I w jaki sposób mogę przechowywać uwierzytelnionego użytkownika w sesji? Im korzystam z systemu uwierzytelniania z ASP.NET, definiując ten znacznik w web.config:

+0

To faktycznie nie działa, ponieważ sesja ASP.NET nie kończy się w Mozilli, jeśli nie zamkniesz konkretnej karty. Jeśli zamkniesz okno bez zamykania karty, sesja będzie nadal aktywna. –

0

Problem wynika z faktu, że jeśli ustawić wygasania, otrzymasz trwałe ciasteczka poniższy kod działa dla mnie, gdzie chcę użytkownikowi wybrać pomiędzy przetrwałym lub przeglądarki sesji tylko ciasteczka z la "pamiętaj mnie" podczas logowania wyboru:

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); 
    } 
0

Dobrze znalazłem to rozwiązanie może pomóc kogoś innego:

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

Źródło: http://forums.asp.net/p/1565112/3895452.aspx

Powiązane problemy