• 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();
            }
        }

    粗略画个图表示下

  • 相关阅读:
    Sprint第二个冲刺(第八天)
    Sprint第二个冲刺(第七天)
    Sprint第二个冲刺(第六天)
    Sprint第二个冲刺(第五天)
    Sprint第二个冲刺(第四天)
    Sprint第二个冲刺(第三天)
    Sprint第二个冲刺(第二天)
    Sprint第二个冲刺(第一天)
    新冲刺Sprint3(第三天)
    新冲刺Sprint3(第二天)
  • 原文地址:https://www.cnblogs.com/rbzz/p/9226412.html
Copyright © 2020-2023  润新知