MVC登陆认证简单设置

 首先,弄个基类

 /// <summary>
    /// 所有控制器基类,里面重写了OnActionExecuted方法
    /// </summary>
    public class BaseController : Controller
    {

        /// <summary>
        /// 是否需要校验
        /// </summary>
        public bool IsCheckLogin { get; set; } = true;

        /// <summary>
        /// 已登陆的用户信息
        /// </summary>
        public UserInfo LoginUser { get; set; }




        /// <summary>
        /// 在方法执行之前调用
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            //如果页面需要校验

            if (IsCheckLogin)
            {
                #region Session方式
                ////校验用户是否登陆
                //if (filterContext.HttpContext.Session["LoginUser"] == null)
                //{
                //    //为空,则跳转到登陆
                //    filterContext.HttpContext.Response.Redirect("/UserLogin/Index");

                //}
                //else
                //{
                //    //不为空,则将用户登陆信息存储
                //    LoginUser = filterContext.HttpContext.Session["LoginUser"] as UserInfo;
                //    //将信息存入viewBag中
                //    ViewBag.UserInfo = LoginUser;
                //} 
                #endregion


                #region 缓存方式
                //校验用户是否登陆
                //获取cookie中的信息

                if (Request.Cookies["userLoginGuid"] == null)
                {
                    //为空,则跳转到登陆
                    filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
                    return;
                }
                string guidUser = Request.Cookies["userLoginGuid"].Value;
                UserInfo userInfo = CacheHelper.getCache<UserInfo>(guidUser);
                if (userInfo == null)
                {
                    //用户长时间不操作,超时
                    filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
                    return;
                }

                //不为空,则将用户登陆信息存储
                LoginUser = userInfo;
                //将信息存入viewBag中
                if (LoginUser == null)
                {
                    ViewBag.UserInfo = "";
                }
                else
                {
                    ViewBag.UserInfo = LoginUser;
                }


                //滑动窗口机制
                CacheHelper.SetCache(guidUser, userInfo, DateTime.Now.AddMinutes(20));
                #endregion

                
            }
        }

    }

,这个基类中有两个属性,

一个是IsCheckLogin,默认为true,该属性主要在子类的构造函数中进行初始化,确定子类是否需要进行登陆认证,一般登陆控制器应设为false

一个是LoginUser,主要记录当前登陆成功用户的实体类

在重写OnActionExecuting的方法中,首先校验IsCheckLogin是否为true,如是,则说明需要登陆校验

此时从cookie中找到登陆时随机生成的guid码,如果没有找到,则直接返回到登陆界面

如果找到,则依据此guid码从缓存中寻找对应的用户实体,如果没有找到一样返回登陆界面,

如果找到则将用户实体放入LoginUser中,以便子类需要.

最后设置缓存的过期时间

 

其中还用到缓存,缓存类的代码如下

 public interface ICacheWrite
    {
        bool AddCache(string key, object value);
        bool AddCache(string key, object value, DateTime exprity);
        object GetCache(string key);
        T getCache<T>(string key);

        void SetCache(string key, object value, DateTime exprity);
        void SetCache(string key, object value);
    }

 缓存的接口类

public class HttpRuntimeCacheWriter : ICacheWrite
    {
        public bool AddCache(string key, object value)
        {
            HttpRuntime.Cache.Insert(key, value);
            return true;
        }

       

        public bool AddCache(string key, object value, DateTime exprity)
        {
            HttpRuntime.Cache.Insert(key, value, null, exprity, TimeSpan.Zero);
            return true;
        }

        public object GetCache(string key)
        {
            return HttpRuntime.Cache.Get(key);
        }

        public T getCache<T>(string key)
        {
            return (T)HttpRuntime.Cache[key];
        }

        public void SetCache(string key, object value)
        {
            HttpRuntime.Cache.Remove(key);
            AddCache(key, value);
        }

        public void SetCache(string key, object value, DateTime exprity)
        {
            throw new NotImplementedException();
        }

       
    }

 运用HttpRuntime缓存

public class CacheHelper
    {
        //这里应该用注入,因为可能更改为其它实现了ICacheWrite的对象
        public static ICacheWrite write { get; set; } = new HttpRuntimeCacheWriter(); //new MemcacheWriter();

        public static bool AddCache(string key, object value)
        {
            return write.AddCache(key, value);
        }

        public static bool AddCache(string key, object value, DateTime exprity)
        {
            return write.AddCache(key, value, exprity);
        }

        public static object GetCache(string key)
        {
            return write.GetCache(key);
        }

        public static T getCache<T>(string key)
        {
            return write.getCache<T>(key);
        }

        public static void SetCache(string key, object value)
        {
            write.SetCache(key, value);
        }

        public static void SetCache(string key, object value, DateTime exprity)
        {
            write.SetCache(key, value, exprity);
        }
    }

 缓存帮助类

 

然后前台调用示例

public class LoginController : BaseController
    {
        //得到用户服务层对象
        IUserInfoSerivce userSerivce = new UserInfoSerivce();

        public LoginController()
        {
            this.IsCheckLogin = false;
        }
        // GET: Login
        public ActionResult Login()
        {

            return View();
        }

        /// <summary>
        /// 进行简单登陆检验
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="pwd"></param>
        /// <returns></returns>
        public ActionResult Check(string uid,string pwd)
        {
            if (!Checked(uid,pwd))
            {
                var user = userSerivce.GetEntities(u => u.Uid == uid && u.pwd == pwd).FirstOrDefault();
                if (user!=null)
                {
                    //立即分配一个标志,Guid,把标志作为key(并写入cookie中),把用户放到value中
                    string userLoginGuid = Guid.NewGuid().ToString();
                    Response.Cookies["userLoginGuid"].Value = userLoginGuid;
                    //将用户登陆信息存到缓存中
                    CacheHelper.AddCache(userLoginGuid, user, DateTime.Now.AddMinutes(20));
                    return Content("ok");
                }
            }
            return Content("ok");
        }


        /// <summary>
        /// 检查用户名密码是否正确
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="pwd"></param>
        /// <returns></returns>
        private bool Checked(string uid,string pwd)
        {
            bool reslut = string.IsNullOrEmpty(uid) || string.IsNullOrEmpty(pwd);  
            return reslut;
        }
    }

 

其它控制器只用继承基类即可

 public class DefaultController : BaseController
    {
        IBLL.IFriendInfoSerivce friendSerivce = new BLL.FriendInfoSerivce();
        // GET: Default
        public ActionResult Index()
        {
            ViewData.Model = friendSerivce.GetEntities(f => !f.DelFlag);
            return View();
        }
    }

 

 

 

粗略画个图表示下

 

posted @ 2018-06-25 21:34  人不自在  阅读(947)  评论(0编辑  收藏  举报