TransWikia.com

¿cual es la manera correcta de un login para que se logen simultaneamente en asp.net?

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.

One Answer

Me parece que hay algunos puntos por aclarar:

  1. Cada petición (cada cliente que se conecte a tu servidor) es un Thread individual.
  2. Cuando el cliente hace una petición, el servidor levanta un hilo, procesa la petición, devuelve una respuesta y el hilo muere.
  3. Las cookies son un archivo que viaja en ambas direcciones en una solicitud desde un cliente de internet (navegador, app). Estas se almacenan en el cliente y le sirven al servidor para identificar cada sesión.
  4. Al declarar elementos 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:

Datos de la sesión

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.

Datos del usuario

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:

  1. 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
        ...
    }
    
  2. 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);
                }
                ...
            }
        }
    }
    
  3. 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP