2010-10-15 11 views
5

Actualmente estoy intentando implementar algo de seguridad personalizada en una aplicación web ASP.NET MVC2.Personalizado IIdentity e IPrincipal utilizando FormsAuthenticationTicket cookie en MVC2

que estoy tratando de hacer algo muy simple como mi código siguiente muestra pero por alguna razón si uso el atributo [Authorize(Roles="Admins")] en una de mis acciones del controlador, compruebe las Context.User.IsInRole("Admins") o Page.User.IsInRole("Admins") siempre es falsa.

También es extraño que el User.Identity.Name también esté en blanco.

Ver mi código de abajo, yo estoy usando un FormsAuthenticationTicket dentro de una cookie que luego utilizo en el mango Application_AuthenticateRequest evento dentro de mi Gloabl.asax para establecer el Context.User con un objeto GenericPrincipal.

Mi código de entrada:

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

     } 

Mi Código Global.asax:

 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 vez me puse la context.User por encima de lo que puedo ver en la ventana de inspección y el objeto se fija a la perfección, en las funciones correctas con el nombre correcto, etc., sin embargo, si intento bloquear las acciones del controlador o uso el Principal desde cualquier lugar de mi sitio, siempre se establece en una cadena vacía sin roles asignados.

Supongo que estoy haciendo algo realmente estúpido aquí, pero si alguien pudiera señalar esto, realmente lo agradecería.

+0

puede u por favor, puesto que su configuración web.config FORMAS, por favor? –

+0

tengo el mismo problema – Mohsen

Respuesta

2

Compruebe que está asignando su nuevo UserPrincipal tanto al HttpContext y el hilo actual dentro de la solicitud OnPostAuthenticate en global.asax:

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

He intentado esto y todavía no tengo suerte :( – MarkB29

Cuestiones relacionadas