如何持续登录整个会话的用户数据?

时间:2014-06-26 02:06:37

标签: c# asp.net-mvc-4

我正在使用MVC4创建一个练习管理应用程序,但我不确定在会话的整个生命周期内保持登录用户数据的最佳方法,以便所有视图都可以访问它。控制器。

例如,我希望用户登录,然后从数据库下载用户数据,对于整个会话,我想维护用户模型(名称,数据库ID等),以便在整个网络中可以访问应用程序直到用户注销。

将数据存储在加密Cookie中的最佳方法是什么?或者有没有办法使用静态类?

目前我已经阅读了如此使用ViewModel Base类:

    public abstract class ViewModelBase
    {
        public UserModel User { get; set; }
    }

然后我的所有ViewModel都可以继承基类,从而提供对用户数据模型的访问:

public class AllEmployeesViewModel : ViewModelBase
{
    public List<EmployeeModel> Employees { get; set; } 
}

但是,如果在一个Controller操作中我设置了用户数据,那么只有在加载另一个Controller Action时它才会丢失。

对我来说,这似乎是浪费资源和将增加加载时间,以便在每个操作中不断从数据库下载用户数据。

这位新的网络程序员非常欢迎所有建议。如果我错过了任何重要细节,请提出要求,我会尽力回答。

2 个答案:

答案 0 :(得分:4)

您应该查看SessionState以在用户的​​浏览器会话期间存储数据。

http://msdn.microsoft.com/en-us/library/vstudio/ms178581(v=vs.100).aspx

答案 1 :(得分:0)

我会以一种可供控制器访问的方式为类中的应用程序抽象Session。也许是一个Web应用程序核心类。

namespace MyApplication.Core
{
    public class MySession
    {
        private const string _SessionName = "__MY_SESSION__";

        private MySession() { }

        public static MySession Current
        {
            get
            {
                MySession session =
                  (MySession)HttpContext.Current.Session[_SessionName];
                if (session == null)
                {
                    session = new MySession();                
                    HttpContext.Current.Session[_SessionName] = session;
                }
                return session;
            }
        }        
        public UserModel CurrentUser { get; set; }

    }
}

登录控制器逻辑路径中的某处

public void SomeLoginFunction(string userName,string password)
{
    //DO AUTHENTICATION STUFF
    MySession.Current.CurrentUser=aCurrentUserFromDB;
}

在您的基类中

public class ViewModelBase
{
     public UserModel User { get{return {MySession.Current.CurrentUser;}  }
}