2010-10-15 12 views
5

Attualmente sto cercando di implementare una protezione personalizzata in un'applicazione Web ASP.NET MVC2.Personalizzato IIdentity e IPrincipal utilizzando FormsAuthenticationTicket cookie in MVC2

che sto cercando di fare qualcosa di veramente semplice come il mio codice qui sotto mostra, ma per qualche motivo se uso l'attributo [Authorize(Roles="Admins")] su una delle mie azioni di controllo, controlla le Context.User.IsInRole("Admins") o Page.User.IsInRole("Admins") si è sempre false.

È anche strano che lo User.Identity.Name sia vuoto.

Vedere la mia codice qui sotto, sto usando un FormsAuthenticationTicket all'interno di un biscotto che ho poi usato nel manico Application_AuthenticateRequest evento nel mio Gloabl.asax per impostare il Context.User con un oggetto GenericPrincipal.

Il mio codice di accesso:

[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(); 

     } 

mio Global.asax Codice:

 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; 

      } 

Una volta che ho impostato il context.User sopra posso visualizzare nella finestra di controllo e l'oggetto è perfettamente, nei ruoli corretti con il nome corretto ecc, tuttavia se provo a bloccare le azioni del controller o ad utilizzare il Preside da qualsiasi parte del mio sito, è sempre impostato su una stringa vuota senza ruoli assegnati !!

Sto immaginando che sto facendo qualcosa di veramente stupido qui, ma se qualcuno lo sapesse, lo apprezzerei davvero.

+0

can u si prega di inviare il vostro web.config MODULI impostazioni, per favore? –

+0

Ho lo stesso problema – Mohsen

risposta

2

Verificare che si sta assegnando il nuovo userPrincipal sia al HttpContext e il thread corrente all'interno della richiesta OnPostAuthenticate in global.asax:

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

Ho provato questo e ancora senza fortuna :( – MarkB29

Problemi correlati