2010-04-14 16 views
6

No estoy seguro de si esta es la mejor manera de hacerlo, pero quiero mantener vivo un objeto de usuario durante todas las solicitudes del usuario actual. Después de leer varios recursos, aprendí que debes crear tu propio IPrinciple que contenga esto. Pero no quiero activar la base de datos en cada solicitud de autenticación. ¿Alguna recomendación sobre cómo manejar esto? ¿El almacenamiento en caché de la solicitud de db es una buena idea?establecer usuario actual en asp.net mvc

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

      User user; 
      using (HgDataContext hg = new HgDataContext()) 
      { 
       if (Session["user"] != null) 
       { 
        user = (from u in hg.Users where u.EmailAddress == authTicket.Name select u).Single(); 
       } else 
       { 
        user = Session["user"] as User; 
       } 
      } 
      var principal = new HgPrincipal(user); 
      Context.User = principal; 
     } 
    } 
+0

La pregunta no me parece clara. ¿Qué objeto exactamente quieres mantener vivo? En cualquier caso, el fragmento de código no logra mantener vivos los objetos, por lo que parece haber un error. Pero sin saber qué es exactamente lo que estás tratando de lograr, no puedo decir nada más. ¿Podrías por favor elaborar? –

+0

Intento mantener mi objeto de usuario alrededor – TomHastjarjanto

Respuesta

2

Ahora estoy usando el siguiente código que almacena en caché al usuario, ¡tenga cuidado de eliminar la caché después de una actualización!

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
     { 
      HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (authCookie != null) 
      { 
       FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

       User user; 
       Cache cache = HttpContext.Current.Cache; 
       using (HgDataContext hg = new HgDataContext()) 
       { 
        user = cache[authTicket.Name] as User; 
        if (user == null) 
        { 
         user = (from u in hg.Users where u.EmailAddress == authTicket.Name select u).Single(); 
         cache[authTicket.Name] = user; 
        } 
       } 
       var principal = new HgPrincipal(user); 
       Context.User = principal; 
      } 
     } 
0

Crear su propia implementación de IPrincipal es la mejor manera de hacerlo. No es un problema almacenar en caché los datos de un usuario, siempre y cuando los actualice si se actualizan. Por lo general, solo el usuario tiene la capacidad de cambiar sus datos personales para que no sea difícil hacerlo. Puede ver una manera fácil de cambiar el usuario actual en this blog post.

3

La sesión es probablemente la forma adecuada de hacer esto, y de hecho es uno de los pocos usos de Session que recomendaría.

Cuestiones relacionadas