5

Estoy desarrollando una aplicación web ASP.Net MVC 3 con Entity Framework 4. Cuando un usuario entra en mi solicitud me gustaría almacenan su entidad de usuario (nombre, apellido, etc.) en una sesión que luego se puede acceder a través de la aplicación.ASP.Net MVC almacén de la entidad de usuario en la sesión

entiendo que esto puede no ser una buena idea porque cuando el ObjectContext cierra/se deshace, entonces la entidad de usuario es independiente y los datos de usuario se podrían perder.

pensé otro método podría ser, cuando el usuario inicia una sesión, asignar el ID de usuario (clave principal) para una variable de sesión, es decir:

HttpContext.Current.Session["currentUserID"] = user.userID; 

continuación, crear una clase en la clase UserService así:

public static User CurrentUser 
    { 

     get 
     { 
      return Data.DBEntities.Users.Where(u => u.userID == HttpContext.Current.Session["currentUserID"]).FirstOrDefault(); 
     } 

    } 

Que debería devolver una entidad de usuario basada en la variable de sesión del ID de usuario actual. Esto no está funcionando para mí, sin embargo, yo estoy haciendo un par de errores

Cannot convert lambda expression to type 'string' because it is not a delegate type 
Delegate 'System.Func<Asset.Model.User,int,bool>' does not take 1 arguments 

Este es el enfoque que estoy tomando correcto, o hay una mejor manera?

Cualquier comentario sería muy apreciado.

Respuesta

9

En primer lugar, no almacenan la información confidencial en Session. Google "secuestro de sesión ASP.NET" para obtener información sobre por qué.

Dicho esto, este código puede ser hecho para trabajar. Solo tienes un error de lanzamiento. Además, no tiene en cuenta el hecho de que Session puede y tiene caducan durante un inicio de sesión. Usted puede hacer esto:

public static User CurrentUser 
{ 
    get 
    { 
     object userID = HttpContext.Current.Session["currentUserID"]; 
     if (userID == null) 
     { 
      throw new InvalidOperationException("Oops!"); 
     } 
     return Data.DBEntities.Users.Where(u => u.userID == (int)userId).FirstOrDefault(); 
    } 
} 

... los cuales al menos compila, pero no es seguro y, a veces tiros.

Sería mejor almacenar el ID de usuario en un custom principal, que es seguro y no caduca.

+0

Gracias por su respuesta. – tgriffiths

0

Puede almacenar entidad completa en la sesión. Se separará, pero no significa que perderá valores, solo en caso de carga lenta no podrá cargar las propiedades de navegación de carga lenta.

En su código actual de tratar de conseguir sus currentUserId a la variable temporal y utilice esa variable en su consulta.

+1

Además de los dos problemas ya mencionados en mi respuesta, esto introduce el riesgo adicional de que su aplicación falle en el tiempo de ejecución si (1) cambia a un almacén de sesión distribuido y (2) tiene propiedades no serializables. Dicho esto, creo que "inseguro y poco confiable" son razones suficientes para no incluir esto en la "sesión" incluso sin el riesgo adicional. 'Session' es un caché específico del usuario, no un almacén de datos seguro y de propósito general. –

+0

@ Craig: buenos puntos. –

Cuestiones relacionadas