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?
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.
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.
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);
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ść.
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);
}
}
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());
}
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