2010-10-08 1 views
4

J'essaie d'implémenter la fonctionnalité Logout dans ASP.NET MVC. J'utilise l'authentification par formulaires pour mon projet.Impossible de se déconnecter de l'application ASP.NET MVC à l'aide de FormsAuthentication.SignOut()

Ceci est mon code Déconnexion:

FormsAuthentication.SignOut(); 
Response.Cookies.Clear(); 
FormsAuthenticationTicket ticket = 
    new FormsAuthenticationTicket(
     1, 
     FormsAuthentication.FormsCookieName, 
     DateTime.Today.AddYears(-1), 
     DateTime.Today.AddYears(-2), 
     true, 
     string.Empty); 

Response.Cookies[FormsAuthentication.FormsCookieName].Value = 
      FormsAuthentication.Encrypt(ticket); 
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = 
      DateTime.Today.AddYears(-2); 

return Redirect("LogOn"); 

Ce code redirige l'utilisateur à l'écran de connexion. Toutefois, si j'appelle une méthode d'action en spécifiant le nom dans la barre d'adresse (ou sélectionnez le lien précédent dans la liste déroulante), je peux toujours accéder aux pages sécurisées sans me connecter.

Quelqu'un pourrait-il m'aider à résoudre le problème? problème?

+0

Pourquoi u n'utilisent pas FormsAuthentication.SignOut()? – Aliostad

+0

@Aliostad: Maintenant changé le code source, précédemment l'appel de méthode a été enveloppé. – vijaysylvester

+0

@vijaysylvester - Pourriez-vous nous donner des détails sur la façon dont vous sécurisez vos pages sécurisées? – Venemo

Répondre

6

C'est étrange ... Je fais un seul appel à: FormsAuthentication.SignOut(); et cela fonctionne ...

public ActionResult Logout() { 
    FormsAuthentication.SignOut(); 
    return Redirect("~/"); 
} 
+0

J'ai utilisé un réflecteur et vu ce que le FormsAuth.SignOut() faisait. Il fait la même chose que j'essaie d'accomplir. Cela définit la propriété expires du cookie à la date précédente. Mais il ajoute soigneusement le cookie à la réponse, mais je fais cela, c'est le problème ici. Merci pour l'aide! – vijaysylvester

1

Pour répondre correctement à votre question, je dois savoir comment sécuriser vos pages «sécurisées».
Je suppose que vous faites quelque chose de mal là-bas.

Un simple appel à FormsAuthentication.SignOut() devrait être suffisant, car il efface le cookie d'authentification, rendant ainsi les autres appels de méthode que vous y faites redondants. Avec ASP.NET MVC, vous devez utiliser AuthorizeAttribute sur une méthode d'action pour interdire aux visiteurs non authentifiés de l'utiliser. (Signification: l'ancienne vous l'avez fait avec formulaires Web en spécifiant les balises de localisation dans Web.configne fonctionne plus avec MVC.)

Par exemple, voici un petit extrait de code de ma ForumController classe:

public class ForumController : Controller 
{ 
    ... 

    [Authorize] 
    public ActionResult CreateReply(int topicId) 
    { 
     ... 
    } 

    ... 
} 
+0

Pour être clair, même si vous effacez le cookie côté serveur à l'aide de SignOut(), le client transmet le cookie d'authentification de formulaires à la demande suivante. Pour éviter cela, j'ajoute un cookie avec le même nom, mais avec un temps expiré. – vijaysylvester

+0

@vijaysylvester - Eh bien, comment expliquez-vous que ça marche pour moi et @Palantir aussi? – Venemo

+0

@vijaysylvester - vous avez raison de dire que le cookie sera toujours envoyé (jusqu'à son expiration), mais ce n'est pas important, car ce cookie sera considéré comme «périmé» pour ASP.NET. Il y a d'autres étapes pour renforcer cela, telles que l'expiration absolue et SSL - mais le "hack" d'ajouter un cookie avec le même nom n'est pas l'un d'entre eux. Je ne pense pas que FormsAuth est le problème ici. – RPM1984

Questions connexes