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?
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.
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.
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);
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.
Dans votre méthode de login.aspx Page_Load:
if (!this.IsPostBack)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
FormsAuthentication.SignOut();
Response.Redirect(Request.RawUrl);
}
}
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.
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());
}