64 votes

Page.User.Identity.IsAuthenticated toujours vrai après FormsAuthentication.SignOut ()

J'ai une page qui, lorsque vous cliquez sur "Déconnexion", sera redirigée vers la page login.aspx qui possède une méthode page_load qui appelle FormsAuthentication.SignOut ().

La page maître affiche le lien "Déconnexion" en haut à droite de l'écran et à condition que Page.User.Identity.IsAuthenticated soit à true. Cependant, après avoir parcouru le code, cette méthode de déconnexion ne définit pas automatiquement isAuthenticated sur false, ce qui est plutôt gênant. Des idées?

109voto

Mart Points 2583

Page.User.Identity.IsAuthenticated reçoit sa valeur de Page.User (évidemment) qui est malheureusement en lecture seule et n'est pas mis à jour lorsque vous appelez FormsAuthentication.SignOut().

Heureusement Page.User tire sa valeur de Context.User qui peut être modifié:

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

Ceci est utile lorsque vous déconnecter l'utilisateur actuel et souhaitez réagir avec la page en question, sans faire une redirection. Vous pouvez le vérifier IsAuthenticated où vous en avez besoin à l'intérieur de la même page de la demande.

13voto

Brian Ball Points 6468

Une personne est seulement une fois authentifié par demande. Une fois ASP.NET détermine si elles sont authentifiés ou non, il n'y a pas de changement pour le reste de la demande.

Par exemple, lorsque quelqu'un se connecte. Lorsque vous définissez les formes auth témoin indiquant qu'ils sont connecté, si vous vérifiez pour voir si elles sont authentifiés sur la même requête, il sera de retour false, mais sur la demande suivante, il sera de retour true. La même chose se passe lorsque vous vous connectez à quelqu'un. Ils sont encore authentifié pour la durée de cette demande, mais sur le prochain, ils ne pourront plus être authentifié. Donc, si un utilisateur clique sur un lien pour se déconnecter, vous devez vous connecter sortir puis un redirect vers la page de connexion.

6voto

Patrick Steele Points 7864

Je me souviens d'avoir eu un problème similaire et je pense l'avoir résolu en supprimant le cookie d'authentification par formulaire au moment de la déconnexion:

 FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
 

1voto

James McCormack Points 4828

Dans votre méthode de login.aspx Page_Load:

 if (!this.IsPostBack)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
    }
}
 

0voto

Korayem Points 2665

Ça marche pour moi

 public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Request.Cookies.AllKeys)
        {
            Request.Cookies.Remove(cookie);
        }
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X