web-dev-qa-db-fra.com

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

J'ai une page qui, lorsque vous appuyez 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?

59
lisburnite

Page.User.Identity.IsAuthenticated tire 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ée:

// 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éconnectez l'utilisateur actuel et souhaitez répondre à la page actuelle sans faire de redirection. Vous pouvez vérifier IsAuthenticated où vous en avez besoin dans la même demande de page.

98
Mart

Une personne n'est authentifiée qu'une fois par demande. Une fois qu'ASP.NET a déterminé s'ils sont authentifiés ou non, cela ne change pas pour le reste de cette demande.

Par exemple, lorsque quelqu'un se connecte. Lorsque vous définissez le cookie d'authentification de formulaire pour indiquer qu'il est connecté, si vous vérifiez s'il est authentifié sur la même demande, la valeur retournée est false, mais la demande suivante le renvoie true. La même chose se passe lorsque vous déconnectez quelqu'un. Ils sont toujours authentifiés pour la durée de cette demande, mais lors de la suivante, ils ne seront plus authentifiés. Ainsi, si un utilisateur clique sur un lien pour se déconnecter, vous devez le déconnecter puis / émettre une redirection vers la page de connexion.

11
Brian Ball

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

Pourquoi exécutez-vous le code de déconnexion dans le fichier login.aspx?

Mettez ce code dans, par exemple. logout.aspx:

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

IsAuthenticated sera false dans login.aspx. Le code de connexion et le code de déconnexion sont désormais séparés: responsabilité unique.

4
Michel van Engelen

Dans votre méthode de login.aspx Page_Load:

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

Dans l'une de mes applications lorsque je suis connecté avec des informations d'identification, naviguez vers différents formulaires dans une application, puis j'ai copié l'un de mes URL de formulaire navigué, puis déconnectez-vous de l'application. dans l'onglet de recherche, collez l'URL du navigateur et accédez au formulaire spécifique dans mon application sans vous connecter. lors de la vérification de l'authentification du formulaire sous la forme page.User.Identity.IsAuthenticated, devenir aussi vrai même lorsque nous nous déconnectons. Les causes de ceci sont lors de l'effacement de la session lors de la déconnexion, j'ai ajouté

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

avec cela, je ne reçois plus ce problème et le drapeau page.User.Identity.IsAuthenticated devient aussi faux lorsque nous naviguons vers les différents formulaires dans une application sans connexion.

1
Mike

Mettre à jour

J'ai eu des commentaires que ma réponse n'a pas fonctionné avec beaucoup de gens. J'ai écrit cette réponse en 2011 après avoir déchiré mes oreilles. Je suis donc presque sûr que cela a résolu le problème.

J'ai commencé à faire des recherches sur ce problème vieux de 6 ans et je suis arrivé à cette solution qui, je pense, pourrait être la bonne façon de supprimer les cookies, c'est-à-dire en les recréant mais avec des dates d'expiration.


Ça marche pour moi

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