如何为用户创建唯一会话:ASP.NET

How to create a unique session for a user: ASP.NET

我一直在学习 ASP.NET 并且意识到我的 Web 应用程序只为所有用户创建一个静态会话,也就是说,如果一个用户注销,所有用户都会注销,并且有时甚至会交换会话(假设用户 A 登录并在用户 B 登录后立即登录,当用户 A 刷新时,他看到的是用户 B 的数据)。

我的 SessionManager class 如下

SessionManager.cs

public  class SessionManager
    {
        #region Private Data

        private static String USER_KEY = "user";

        #endregion

        public static Employee CurrentUser
        {
            get;
            set;
        }
        public static string UserType
        {
            get;
            set;
        }
        public static Int32 SessionTimeout
        {
            get
            {
                return System.Web.HttpContext.Current.Session.Timeout;
            }
        }

        public static String GetUserFullName()
        {
            if (SessionManager.CurrentUser != null)
                return SessionManager.CurrentUser.FirstName;
            else
                return null;
        }
        public static Boolean IsUserLoggedIn
        {
            get
            {
                if (SessionManager.CurrentUser != null)
                    return true;
                else
                    return false;
            }

        }

        #region Methods
        public static void AbandonSession()
        {
            for (int i = 0; i < System.Web.HttpContext.Current.Session.Count; i++)
            {
                System.Web.HttpContext.Current.Session[i] = null;
            }
            System.Web.HttpContext.Current.Session.Abandon();
        }

        #endregion
    }

登录控制器:

 [HttpPost]
        public ActionResult Index(String txtUserName, String txtPassword)
            if (User.Identity.IsAuthenticated)
            {
                return View();
            }
            else
            {
                if (ModelState.IsValid)
                {
Employee obj = (from o in db.Employees
                                        where o.Email == txtUserName && o.Password == txtPassword
                                        select o).FirstOrDefault();
 if (obj != null)
                        {
  var dh = db.Departments.Where(x => x.LeadBy == obj.EmployeeId).FirstOrDefault();
                            var tl = db.Teams.Where(x => x.LeadBy == obj.EmployeeId).FirstOrDefault();
                            if (dh == null && tl == null)
                            {
                                Session["UserType"] = "EMP";
                            }
                            else if (dh != null && tl != null)
                            {
                                Session["UserType"] = "DH&TL";
                            }
                            else if (dh != null)
                            {
                                Session["UserType"] = "DH";
                            }
                            else if (tl != null)
                            {
                                Session["UserType"] = "TL";
                            }
 SessionManager.CurrentUser = obj; //how can I create different obj for different users here?
 var currentEnrollID = SessionManager.CurrentUser.EnrollNumber;      
 var currentEmployeeID = SessionManager.CurrentUser.EmployeeId;
 var currentEmpName = SessionManager.CurrentUser.FirstName + " " + SessionManager.CurrentUser.LastName;

我一直在整个应用程序中使用这样的会话,因此采用不同的方法来修改更改会很忙。

public ActionResult Logout()
        {
            if (SessionManager.IsUserLoggedIn)
            {
                SessionManager.CurrentUser.EmployeeId = 0;
                SessionManager.AbandonSession();
                Session.Clear();
                Session.Abandon();
                Session.RemoveAll();
            }
            return RedirectToAction("Index","Login");
        }

这与 ASP.NET 无关,但更多的是关于静态成员的工作原理。

真正的问题是您的 SessionsManager,它包含每次用户 logs-in 时您存储值的静态方法。这意味着同一实例在应用程序中的不同会话之间共享。

我有一个更新的 SessionManager,您可以在下面看到。我已将 SessionManager 对象存储在会话对象中,以便只要会话处于活动状态。当您使用 SessionManager.Current.

调用它时,它将 return 通过会话调用相同的实例
public class SessionManager {
    #region Private Data

    private static String USER_KEY = "user";

    #endregion

    public static SessionManager Current {
        get{
            if (HttpContext.Current.Session[USER_KEY] != null) {
                return (SessionManager) HttpContext.Current.Session[USER_KEY];
            } else {
                var sess = new SessionManager ();
                HttpContext.Current.Session[USER_KEY] = sess;
                return sess;
            }
        }
    }

    public Employee CurrentUser {
        get;
        set;
    }
    public string UserType {
        get;
        set;
    }
    public Int32 SessionTimeout {
        get {
            return System.Web.HttpContext.Current.Session.Timeout;
        }
    }

    public String GetUserFullName () {
        if (SessionManager.Current.CurrentUser != null)
            return SessionManager.Current.CurrentUser.FirstName;
        else
            return null;
    }
    public Boolean IsUserLoggedIn {
        get {
            if (SessionManager.Current.CurrentUser != null)
                return true;
            else
                return false;
        }

    }

    #region Methods
    public void AbandonSession () {
        for (int i = 0; i < System.Web.HttpContext.Current.Session.Count; i++) {
            System.Web.HttpContext.Current.Session[i] = null;
        }
        System.Web.HttpContext.Current.Session.Abandon ();
    }

    #endregion
}