Stack Overflow en español Asked by Luis Alberto Acosta on December 11, 2021
tengo esta clase estatica para tener los datos del usuario pero es un diseño para escritorio porque me di cuenta que en web comparten los recurso. si inicia otros usuarios se sobrescribe la sesion
public class Authweb
{
private Authweb() { }
public static CatUser user;
public static CatSuperior nivel;
public static List<regNivel> listNivel;
public static Boolean VerificarUser(string puser, string pass)
{
user = DataBD.getUser(puser, pass);
if(user != null)
{
nivel = DataBD.GetNivelUser(user.IdUser);
if (nivel != null)
listNivel = DataBD.GetNivels(nivel.IdSuperior);
return true;
}
return false;
}
}
asi que que pregunto como hacer que cada quien tenga sus Datos que esten manejando sin afectar a los demas.
Me parece que hay algunos puntos por aclarar:
Thread
individual.static
, lo que haces es que ese dato en particular "persista" a través de todas las sesiones, ya que estos se quedan en la memoria de la aplicación (recuerda que un sitio es una aplicación) a manera de singleton Esto no es necesariamente malo, pero hay que saber cuándo usarlo.Respondiendo a la pregunta, cada vez que requieras acceder a la información del usuario actual hay dos alcances:
Cada conexión que se realiza tiene (dentro de C# MVC) un objeto User
con una propiedad Identity
(dentro de los Controllers y las Views puedes acceder directamente a él: User.Identity
; en cualquier otro punto es necesario acceder mediante el contexto de la sesión: HttpContext.Current.User.Identity
). Aquí encontrarás un IsAuthenticated
, el AuthenticationType
y una propiedad Name
con las que puedes saber si el usuario se ha logeado o conocer el nombre de la cuenta y no necesitarás nada más.
Para obtener más datos del usuario (por ejemplo, para mostrar su perfil) deberás escribir un modelo y acceder a su información desde un lugar persistente. Normalmente esto significa acceder a la base de datos cada vez que quieras obtener esa información.
Si quieres evitar el acceso recurrente a disco, solo veo una manera posible:
Crea una lista estáticas de (modelo de) usuarios.
public class Authweb
{
public static List<UserModel> Usuarios = new List<UserModel>();
// Tendrías que escribir la clase UserModel
...
}
Cada vez que un usuario inicie sesión, crea un nuevo modelo e insértalo en la lista anterior:
public ActionResult Login(User user, string ReturnUrl = "/Home")
{
if (ModelState.IsValid)
{
try
{
if (user.IsValid(user.UserName, user.Password))
{
FormsAuthentication.SetAuthCookie(user.UserName, false);
UserModel u = new UserModel(user.UserName); // Aquí obtendrías la información
Authweb.Usuarios.Add(u);
return Redirect(ReturnUrl);
}
...
}
}
}
Cada vez que quieras acceder a dicha información, solo tendrías que consultar a la lista:
UserModel um = Authweb.Usuarios.Find(u => u.IdUsuario.Equals(User.Identity.Name));
Sin embargo, no recomiendo esta aproximación ya que deberías encargarte de programar una rutina para eliminar a los usuarios inactivos, verificar que la cantidad de usuarios no llenen esta lista a un punto que se desborde la memoria (ya sabes, una StackOverflowException
) y en fin, hacer manualmente el mantenimiento a la lista.
Answered by Kroneaux Schneider on December 11, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP