2010-11-05 30 views
13

OK, aquí está mi código para crear una cookie de autenticación:problema al crear persistente cookie de autenticación: ASP.NET MVC

 // get user's role 
     List<UserType> roles = rc.rolesRepository.GetUserRoles(rc.userLoginRepository.GetUserID(userName)); 
     List<string> rolesList = (from r in roles 
           select r.ToString()).ToList(); 
     string[] rolesArr = rolesList.ToArray(); 

     // create encryption cookie 
     FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
       1, 
       userName, 
       DateTime.Now, 
       DateTime.Now.AddDays(90), 
       createPersistentCookie, 
       String.Join(";",rolesArr) //user's roles 
       ); 

     // add cookie to response stream 
     string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

     System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
     System.Web.HttpContext.Current.Response.Cookies.Add(authCookie); 
     //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

y aquí está mi código en Global.asax para configurar las funciones de usuario en la identidad del usuario:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie == null || authCookie.Value == "") 
     { 
      return; 
     } 
     FormsAuthenticationTicket authTicket = null; 
     try 
     { 
      authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      string[] roles = authTicket.UserData.Split(new char[] { ';' }); 
      if (Context.User != null) 
      { 
       Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles); 
      } 
     } 
     catch 
     { 
      return; 
     } 
    } 

Sin embargo, si "createPersistentCookie" es VERDADERO en el ejemplo superior, no se crea ninguna cookie persistente. Si descomiento la última línea como sigue:

 //System.Web.HttpContext.Current.Response.Cookies.Add(authCookie); 
     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

y luego la cookie persistente se crea en mi disco duro. PERO, en el código Global.asax, el campo UserData en "authTicket" está en blanco, ¡así que no puedo configurar los roles correctamente!

Así que tengo que usar SetAuthCookie para crear una cookie persistente, pero luego, por alguna razón, el campo UserData desaparece de la cookie persistente.

¿Cuál es la respuesta a esto?

Respuesta

17

Para crear una cookie persistente es necesario establecer la propiedad Expires:

if (authTicket.IsPersistent) 
{ 
    authCookie.Expires = authTicket.Expiration; 
} 
+0

Sí, que lo hizo! Muchas gracias. Me he estado arrancando los pelos. Ahora puedo usar Response.Cookies.Add en lugar de SetAuthCookie, y se crea una cookie persistente Y el UserData no se borra (¡extraño!) – Cynthia

Cuestiones relacionadas