2010-10-15 2 views
5

J'essaie actuellement d'implémenter une sécurité personnalisée dans une application Web ASP.NET MVC2.Personnalisé IIdentity et IPrincipal utilisant le cookie FormsAuthenticationTicket dans MVC2

Je suis en train de faire quelque chose de vraiment simple que mon code ci-dessous montre, mais pour une raison quelconque si j'utilise l'attribut [Authorize(Roles="Admins")] sur un de mes actions de contrôleur, vérifiez la Context.User.IsInRole("Admins") ou Page.User.IsInRole("Admins") il est toujours faux.

Il est également étrange que le User.Identity.Name soit également vide.

Voir mon code ci-dessous, je me sers d'un FormsAuthenticationTicket dans un biscuit que je puis utiliser dans le manche de l'événement Application_AuthenticateRequest dans mon Gloabl.asax pour régler le Context.User avec un objet GenericPrincipal.

Mon code de connexion:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Login(string username, string password) 
     { 

      //this would obviously do a check against the supplied username and password 
      if (true) 
      { 
       FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, 
       DateTime.Now.AddMinutes(15), false, "Admins|Users|Members"); 

       string encTicket = FormsAuthentication.Encrypt(ticket); 

       HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 

       this.Response.Cookies.Add(cookie); 
       string url = FormsAuthentication.GetRedirectUrl(username, false); 

       Response.Redirect(url);    
      } 


      return View(); 

     } 

Mon Global.asax code:

 void MvcApplication_AuthenticateRequest(object sender, EventArgs e) 
     { 
      HttpApplication application = (HttpApplication)sender; 
      HttpContext context = application.Context; 

      var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName]; 

      if (cookie != null) 
      {     

       // Get the authentication ticket 
       // and rebuild the principal & identity 
       FormsAuthenticationTicket authTicket = 
        FormsAuthentication.Decrypt(cookie.Value); 
       string[] roles = authTicket.UserData.Split(new Char[] { '|' }); 
       GenericIdentity userIdentity = new GenericIdentity(authTicket.Name); 
       GenericPrincipal userPrincipal = 
        new GenericPrincipal(userIdentity, roles); 

       context.User = userPrincipal; 

      } 

Une fois que je mets le context.User ci-dessus, je peux voir dans la fenêtre de la montre et l'objet est défini parfaitement, dans les rôles corrects avec le bon nom etc, cependant si j'essaie de verrouiller les actions du contrôleur ou d'utiliser le Principal à partir de n'importe où sur mon site, il est toujours défini sur une chaîne vide sans rôles assignés !!

Je suppose que je fais quelque chose de vraiment stupide ici, mais si quelqu'un pouvait le signaler, je l'apprécierais vraiment.

+0

peut u s'il vous plaît poster votre web.config paramètres FORMULAIRES, s'il vous plaît? –

+0

J'ai le même problème – Mohsen

Répondre

2

Vérifiez que vous assignez votre nouvelle UserPrincipal à la fois HttpContext et le fil de courant dans la demande OnPostAuthenticate dans global.asax:

HttpContext.Current.User = userPrincipal; 
Thread.CurrentPrincipal = userPrincipal; 
+0

J'ai essayé cela et toujours pas de chance :( – MarkB29

Questions connexes