Strona.Użytkownik.Tożsamość.IsAuthenticated nadal prawdziwe po FormsAuthentication.SignOut()

Mam stronę, która po naciśnięciu "Wyloguj" przekieruje do strony login.aspx, która ma metodę Page_Load, która wywołuje FormsAuthentication.SignOut().

Strona wzorcowa wyświetla link "Wyloguj się" w prawym górnym rogu ekranu i wyświetla go pod warunkiem, że Page.User.Identity.IsAuthenticated jest true. Po przejściu przez kod jednak ta metoda logowania nie ustawia automatycznie IsAuthenticated na false, co jest dość denerwujące, jakieś pomysły?

Author: Mitat Koyuncu, 2010-10-29

6 answers

Page.User.Identity.IsAuthenticated pobiera swoją wartość z Page.User (oczywiście), która niestety jest tylko do odczytu i nie jest aktualizowana podczas wywoływania FormsAuthentication.SignOut().

Na szczęście Page.User pobiera jego wartość z Context.User, którą można modyfikować:

// HttpContext.Current.User.Identity.IsAuthenticated == true;

FormsAuthentication.SignOut();
HttpContext.Current.User =
    new GenericPrincipal(new GenericIdentity(string.Empty), null);

// now HttpContext.Current.User.Identity.IsAuthenticated == false
// and Page.User.Identity.IsAuthenticated == false

Jest to przydatne, gdy wylogowujesz się z bieżącego użytkownika i chcesz odpowiedzieć na aktualną stronę bez wykonywania przekierowania. Możesz sprawdzić IsAuthenticated Gdzie jest to potrzebne w tym samym żądaniu strony.

 95
Author: Mart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 14:21:24

Osoba jest uwierzytelniana tylko raz na żądanie. Raz ASP.NET określa, czy są uwierzytelnione, czy nie, to nie zmienia się w pozostałej części tego żądania.

Na przykład, gdy ktoś się loguje. Po ustawieniu pliku cookie formularzy auth wskazującego, że są zalogowane, jeśli sprawdzisz, czy są uwierzytelnione w tym samym żądaniu, zwróci false, ale przy następnym żądaniu zwróci true. To samo dzieje się, gdy kogoś wylogowujesz. Nadal są uwierzytelnione na czas trwania tego wniosku, ale w następnym nie będą już uwierzytelnione. Więc jeśli użytkownik kliknie link, aby się wylogować, powinieneś go wylogować , a następnie wydać przekierowanie na stronę logowania.

 10
Author: Brian Ball,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-26 19:12:16

Pamiętam, że miałem podobny problem i chyba go rozwiązałem, wygasając plik cookie uwierzytelniania formularzy w czasie wylogowania:

FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
 6
Author: PatrickSteele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-29 11:51:03

Dlaczego wykonujesz kod wylogowania w loginie.aspx?

Wpisz ten kod np. Wyloguj.aspx:

FormsAuthentication.SignOut()
Session.Abandon()
FormsAuthentication.RedirectToLoginPage()
HttpContext.Current.ApplicationInstance.CompleteRequest()
return

IsAuthenticated będzie false w login.aspx. Login i Kod wylogowania są teraz rozdzielone: jedna odpowiedzialność.

 4
Author: Michel van Engelen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 09:30:56

W Twoim loginie.metoda aspx Page_Load:

if (!this.IsPostBack)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
    }
}
 1
Author: James McCormack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-16 08:51:31

Update

Dostałem komentarze, że moja odpowiedź nie działa z wielu ludzi. Napisałem tę odpowiedź w 2011 roku po rozerwaniu mojego słuchu. Więc jestem prawie pewien, że to rozwiązało problem.

Zacząłem badać ten 6-letni problem i doszedłem do tego rozwiązania , które moim zdaniem może być właściwym sposobem na usunięcie plików cookie, czyli utworzenie ich ponownie, ale z wygasłymi datami.


To działa dla mnie

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }
 0
Author: Korayem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-11 15:17:06