8. mvc直接的关系 (过滤器验证是否登录-根据特性返回重定向报文 )

你吧消息给我,我把它分装成一个对象。

==========重定向Json格式===============================================================

using Common.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace MVCOA.Helper
{
    /// <summary>
    /// 操作上下文
    /// </summary>
    public class OperateContext
    {
        const string Admin_CookiePath = "/admin/";
        const string Admin_InfoKey = "ainfo";
        const string Admin_PermissionKey = "apermission";
        const string Admin_TreeString = "aTreeString";
        const string Admin_LogicSessionKey = "BLLSession";
    #region 3.1 生成 Json 格式的返回值 +ActionResult RedirectAjax(string statu, string msg, object data, string backurl)
        /// <summary>
        /// 生成 Json 格式的返回值
        /// </summary>
        /// <param name="statu"></param>
        /// <param name="msg"></param>
        /// <param name="data"></param>
        /// <param name="backurl"></param>
        /// <returns></returns>
        public ActionResult RedirectAjax(string statu, string msg, object data, string backurl)
        {
            MODEL.FormatModel.AjaxMsgModel ajax = new MODEL.FormatModel.AjaxMsgModel()
            {
                Statu = statu,
                Msg = msg,
                Data = data,
                BackUrl = backurl
            };
            JsonResult res = new JsonResult();
            res.Data = ajax;
            return res;
        } 
        #endregion
   }
 }

控制器AdminController

         Login登录方法

         登录成功后重定向到index页

using MVCOA.Helper;
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;

namespace MVCOA.Login.Admin
{
    /// <summary>
    /// 管理员登陆等相关业务
    /// </summary>
    public class AdminController : Controller
    {
       #region 1.0 管理员登陆页面 +ActionResult Login()
        /// <summary>
        /// 1.0 管理员登陆页面
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Common.Attributes.Skip]
        public ActionResult Login()
        {
            return View();
        }
        #endregion


        #region 1.0 管理员登陆页面 +ActionResult Login()
        /// <summary>
        /// 1.0 管理员登陆页面
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Common.Attributes.Skip]
        public ActionResult Login(MODEL.ViewModel.uLoginName UserLogin)
        {//1.2验证(自己做)
            if (!ModelState.IsValid)
            {
return OperateContext.Current.RedirectAjax("err","没有权限!",null,""); }
if (OperateContext.Current.LoginModel(UserLogin))//如果true就登录成功 { //ajaxM.Statu = "ok";//Statu状态 //ajaxM.Msg = "登陆成功~";//Msg消息 //ajaxM.BackUrl = "/admin/admin/index"; return OperateContext.Current.RedirectAjax("ok", "登陆成功~", null, "/admin/admin/index"); } else { return OperateContext.Current.RedirectAjax("err", "失败~~!", null,""); } //return Json(ajaxM); } #endregion

 ==========================================过滤权限=============================

  MVCOA.Login.Admin:登录控制器程序集

  1.LoginValidateAttribute:过滤器方法(登陆过滤)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCOA.Login.Admin.Filter
{
   /// <summary>
   /// 管理员 身份验证 过滤器
   /// </summary>
  public  class LoginValidateAttribute:System.Web.Mvc.AuthorizeAttribute //表示一个特性,特性用于限制调用方操作方法的属性
    {
        #region 1.0 验证方法 - 在 ActionExcuting过滤器之前执行
        /// <summary>
        /// 验证方法 - 在 ActionExcuting过滤器之前执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            //1.如果请求的 Admin 区域里的 控制器类和方法,那么就要验证权限
            if (filterContext.RouteData.DataTokens.Keys.Contains("area")//当前请求匹配的 路由对象中 是否 有 area区域
                && filterContext.RouteData.DataTokens["area"].ToString().ToLower() == "admin")//监测区域名 是否为 admin
            {
                //2.检查 被请求的 方法 和 控制器是否有 Skip 标签,如果有,则不验证;如果没有,则验证
                if (!filterContext.ActionDescriptor.IsDefined(typeof(Common.Attributes.SkipAttribute), false) &&
                    !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(Common.Attributes.SkipAttribute), false))
                {
                    #region 1.验证用户是否登陆(Session && Cookie)
                    //1.验证用户是否登陆(Session && Cookie)
                    if (!OperateContext.Current.IsLogin())
                    {
                        filterContext.Result = OperateContext.Current.Redirect("/admin/admin/login", filterContext.ActionDescriptor);//验证是否登录
                    }
                    #endregion
                    #region //2.验证登陆用户 是否有访问该页面的权限
                    else
                    {
                        //2.获取 登陆用户权限
                        string strAreaName = filterContext.RouteData.DataTokens["area"].ToString().ToLower();//获取区域名
                        string strContrllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();//获取控制器名
                        string strActionName = filterContext.ActionDescriptor.ActionName.ToLower();//获取Action方法名
                        string strHttpMethod = filterContext.HttpContext.Request.HttpMethod;//获取请求方式

                        if (!OperateContext.Current.HasPemission(strAreaName, strContrllerName, strActionName, strHttpMethod))
                        {
                            filterContext.Result = OperateContext.Current.Redirect("/admin/admin/login?msg=noPermission", filterContext.ActionDescriptor);
                        }
                    }
                    #endregion
                }

            }
        }
        #endregion
    }
 OperateContext:上下文类
2.HasPemission方法(是否有权限)
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MODEL;
using System.Web;
using System.Web.SessionState;
using System.Runtime.Remoting.Messaging;
using System.Web.ModelBinding;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using Common.Attributes;



namespace MVCOA.Helper
{
    /// <summary>
    /// 操作上下文
    /// </summary>
    public class OperateContext
    {
  #region 0.2 用户权限 +List<MODEL.Ou_Permission> UsrPermission
        // <summary>
        /// 用户权限
        /// </summary>
        public List<MODEL.Ou_Permission> UsrPermission
        {
            get
            {
                return Seesion[Admin_PermissionKey] as List<MODEL.Ou_Permission>;
            }
            set
            {
                Seesion[Admin_PermissionKey] = value;
            }
        }
        #endregion
   #region  2.3 判断当前用户 是否有 访问当前页面的权限 +bool HasPemission
        /// <summary>
        /// 2.3 判断当前用户 是否有 访问当前页面的权限
        /// </summary>
        /// <param name="areaName">区域名</param>
        /// <param name="controllerName">控制器名</param>
        /// <param name="actionName">控制器action方法名</param>
        /// <param name="httpMethod">请求方式1:get,2:post</param>
        /// <returns></returns>
        public bool HasPemission(string areaName, string controllerName, string actionName, string httpMethod)
        {
            //查询权限表访问权限               //StringComparison.CurrentCultureIgnoreCase:忽略比较的大小写
            var listP = from per in UsrPermission
                        where                   
                            string.Equals(per.pAreaName, areaName, StringComparison.CurrentCultureIgnoreCase) &&     
                            string.Equals(per.pControllerName, controllerName, StringComparison.CurrentCultureIgnoreCase) &&
                            string.Equals(per.pActionName, actionName, StringComparison.CurrentCultureIgnoreCase) &&
                             per.pFormMethod == (httpMethod.ToLower() == "get" ? 1 : 2)
                        select per;  
           return listP.Count() > 0;//大于0说明有权限
        }
        #endregion
  #region 2.0 管理员方式登录+ bool LoginModel(MODEL.ViewModel.uLoginName ModeLogin)
        public bool LoginModel(MODEL.ViewModel.uLoginName  ModeLogin)
        {
            //1.3通过操作上下文获取 用户业务接口对象,调用里面的登陆方法!
            //BLLSession//数据仓储
            //到业务层查询,查到true,如果没查到返回false
            MODEL.Ou_UserInfo usr = OperateContext.Current.BLLSession.IOu_UserInfoBLL.Login(ModeLogin.LoginNames, ModeLogin.uPwd3);//扩展登录Login

            if (usr != null)
            {
                //2.1保存 用户数据(Session or Coookie)//为了安全考虑, MODEL.Ou_UserInfo代理类,改成真正的实体。再存入Cookie
                Usr = usr;//存入Usr对象
                if (!ModeLogin.isAllway)//如果选择了复选框,则使用cookie保存数据,要加密
                {
                    //2.1.2将用户id加密成字符串
                    string strCookieValue = Common.SecurityHelper.EncryptUserInfo(usr.uId.ToString());//调用票据加密
                    //2.1.3创建cookie
                    HttpCookie cookie = new HttpCookie(Admin_InfoKey, strCookieValue);//用户id存入Cookie
                    cookie.Path = Admin_CookiePath;// "/admin/";
                    cookie.Expires = DateTime.Now.AddDays(1);//失效时间是一天
                    Response.Cookies.Add(cookie);//发回去
                }
                //2.2查询当前用户的权限,并将权限存入 Session=================
                //List<MODEL.Ou_Permission> listPermission = MVCOA.Helper.OperateContext.GetUserPermission(usr.uId);//usr.uId是用户id
                //存入Session对象=================
                UsrPermission =OperateContext.Current.GetUserPermission(usr.uId);
                return true;

            }

 App_Start

   FilterConfig //过滤配置类 :必须的

                       3. filters.Add(new Login.Admin.Filter.LoginValidateAttribute());//使用管理员 身份验证 过滤器

using System.Web;
using System.Web.Mvc;

namespace MVCOA
{
    public class FilterConfig   //过滤配置
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new Login.Admin.Filters.LoginValidateAttribute());//使用管理员 身份验证 过滤器,调用过滤方法LoginValidateAttribute()
  } } }

 ===========================登录过滤2,过滤配置添加=========================================

  1. 跳过顾虑 [Common.Attributes.Skip]

  2.LoginModel(UserLogin)实体扩展登陆方法,不是ef代理类。所以比较安全。

  3.Login(MODEL.ViewModel.uLoginName   UserLogin)  //这个是扩展实体登陆,不是代理类。

 4.bool  HasPemission(string areaName, string controllerName, string actionName, string httpMethod)过滤权限有点问题,返回值listP.Count()>0; //这里有点问题,不知什么问题,

   暂时改成:return listP.Count()>0;

 5.**在App_stata

       FilterConfig //过滤配置类 :必须的

       3. filters.Add(new Login.Admin.Filter.LoginValidateAttribute());//使用管理员 身份验证 过滤器

 

using Common.Attributes;
using MVCOA.Helper;
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;

namespace MVCOA.Login.Admin
{
    /// <summary>
    /// 管理员登陆等相关业务
    /// </summary>
    public class AdminController : Controller
    {
        #region 1.0 管理员登陆页面 +ActionResult Login()
        /// <summary>
        /// 1.0 管理员登陆页面
        /// </summary>
        /// <returns></returns>
        [HttpGet]
       [Common.Attributes.Skip]
        public ActionResult Login()
        {
            return View();
        }
        #endregion


        #region 1.0 管理员登陆页面 +ActionResult Login()
        /// <summary>
        /// 1.0 管理员登陆页面
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Common.Attributes.Skip]//有skip标签表示跳过过滤
        public ActionResult Login(MODEL.ViewModel.uLoginName UserLogin)
        {
            //MODEL.FormatModel.AjaxMsgModel ajaxM = new MODEL.FormatModel.AjaxMsgModel() { Statu = "err", Msg = "失败~~!" };

            //1.2验证(自己做)
            if (!ModelState.IsValid)
            {
              return  OperateContext.Current.RedirectAjax("err", "没有权限!", null, "");
            }
            if (OperateContext.Current.LoginModel(UserLogin))//如果true就登录成功 //LoginModel是扩展登陆实体方法,安全
            {

                //ajaxM.Statu = "ok";//Statu状态
                //ajaxM.Msg = "登陆成功~";//Msg消息 
                //ajaxM.BackUrl = "/admin/admin/index";

                return OperateContext.Current.RedirectAjax("ok", "登陆成功~", null, "/admin/admin/index");

            }
            else {
                return OperateContext.Current.RedirectAjax("err", "失败~~!", null,"");
            }
            //return Json(ajaxM);
        }
        #endregion

        #region 2.0 显示管理首页+ ActionResult Index()

        /// <summary>
        /// /// <summary>
        /// 2.0 显示管理首页
        /// </summary>
        /// <returns></returns>
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            return View();
        }
        #endregion

        #region 3.0 根据当前登陆用户 权限 生成菜单 +GetMenuData()
        /// <summary>
        /// 根据当前登陆用户 权限生成菜单
        /// </summary>
        /// <returns></returns>
       [AjaxRequest]
        public ActionResult GetMenuData()
        {
            return  Content(OperateContext.Current.UserTreeJsonStr);
        } 
        #endregion
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MODEL;
using System.Web;
using System.Web.SessionState;
using System.Runtime.Remoting.Messaging;
using System.Web.ModelBinding;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using Common.Attributes;



namespace MVCOA.Helper
{
    /// <summary>
    /// 操作上下文
    /// </summary>
    public class OperateContext
    {
       
         
        //常量本质是静态变量,编译的时候会被替换掉
        const string Admin_CookiePath = "/admin/";
        const string Admin_InfoKey = "ainfo";//存session,cookie
        const string Admin_PermissionKey = "apermission";//用于存储用户权限
        const string Admin_TreeString = "aTreeString";
        const string Admin_LogicSessionkey = "BLLSession"; 
      

        #region 0.1http上下文+Http上下文 及 相关属性
        /// <summary>
        /// http上下文
        /// </summary>
        public static HttpContext Context
        {
            get
            {
                return HttpContext.Current;
            }
        }
        /// <summary>
        /// http上下文
        /// </summary>
        HttpResponse Response
        {
            get
            {
                return Context.Response;

            }
        }
        HttpRequest Request
        {
            get
            {
                return Context.Request;
            }
        }
        HttpSessionState Seesion
        {
            get
            {
                return Context.Session;
            }
        }
        #endregion

        #region  0.2 当前用户+MODEL.Ou_UserInfo Usr
        /// <summary>
        /// 当前用户对象
        /// </summary>
        public MODEL.Ou_UserInfo Usr
        {
            get
            {
                return Seesion[Admin_InfoKey] as MODEL.Ou_UserInfo;}//获取
            set { Seesion[Admin_InfoKey]=value; }//
        }
        
        #endregion

        #region 0.2 用户权限 +List<MODEL.Ou_Permission> UsrPermission
        // <summary>
        /// 用户权限
        /// </summary>
        public List<MODEL.Ou_Permission> UsrPermission
        {
            get
            {
                return Seesion[Admin_PermissionKey] as List<MODEL.Ou_Permission>;
            }
            set
            {
                Seesion[Admin_PermissionKey] = value;
            }
        }
        #endregion

        #region 0.3业务仓储+IBLL.IBLLSession BLLSession;
        /// <summary>
        /// 业务仓储----------------IBLL.IBLLSession仓储接口;           DI.SpringHelper.GetObject<T>()//Spring.Net上下文容器(工厂)
        /// </summary>
        public IBLL.IBLLSession BLLSession ;

        #endregion

        #region 0.2实例构造函数 初始化 业务仓储
        public OperateContext()
        {
            BLLSession = DI.SpringHelper.GetObject<IBLL.IBLLSession>("BLLSession");
        }
        #endregion

        #region 1.0 当前操作上下文+ static OperateContext Current
        /// <summary>
        /// 获取当前 静态操作上下文(从当前服务器处理线程中获取 上下文),针对一个请求,我有一个单独的操作上下文对象。
        /// </summary>
        public static OperateContext Current
        {
            get
            {
                OperateContext oContext = CallContext.GetData(typeof(OperateContext).Name) as OperateContext;
                if (oContext == null)//如果是null,创建
                {
                    oContext = new OperateContext();
                    CallContext.SetData(typeof(OperateContext).Name, oContext);//放回
                }
                return oContext;
            }
        }
        #endregion

        //================2.0登录权限 等系统操作============================================


        #region  2.0根据用户id查询用户权限+List<MODEL.Ou_Permission> GetUserPermission(int usrId)
        public List<MODEL.Ou_Permission> GetUserPermission(int usrId) //在2.0登录会调用 bool LoginModel(MODEL.ViewModel.uLoginName ModeLogin)
        {
            //-------A.根据用户角色查询
            //1.0 根据用户 id 查到 该用户的 角色id
            List<int> listRoleId = Current.BLLSession.IOu_UserRoleBLL.GetListBy(ur => ur.urUId == usrId).Select(ur => ur.urRId).ToList();
            //2.0 根据角色 id 查询角色权限 id
            List<int> listPerIds = Current.BLLSession.IOu_RolePermissionBLL.GetListBy(rp => listRoleId.Contains(rp.rpRId)).Select(rp => rp.rpPId).ToList();
            //3.0 查询所有角色数据
            List<MODEL.Ou_Permission> listPermission = Current.BLLSession.IOu_PermissionBLL.GetListBy(p => listPerIds.Contains(p.pid)).Select(p => p.ToPOCO()).ToList();
            //-------B.根据用户特权查询
            //b.1 查询 用户特权id
            List<int> vipPerIds = Current.BLLSession.IOu_UserVipPermissionBLL.GetListBy(vip => vip.vipUserId == usrId).Select(vip => vip.vipPermission).ToList();
            //b.2 查询 特权数据
            List<MODEL.Ou_Permission> listPermission2 = Current.BLLSession.IOu_PermissionBLL.GetListBy(p => vipPerIds.Contains(p.pid)).Select(p => p.ToPOCO()).ToList();
            //-------C.将两个权限集合 合并(将集合2的权限数据 添加到 集合1中)
            listPermission2.ForEach(p =>
            {
                listPermission.Add(p);
            });
            return listPermission.OrderBy(u => u.pOrder).ToList();
        }
        #endregion


        #region 2.0 管理员方式登录+ bool LoginModel(MODEL.ViewModel.uLoginName ModeLogin)
        public bool LoginModel(MODEL.ViewModel.uLoginName ModeLogin)
        {
            //1.3通过操作上下文获取 用户业务接口对象,调用里面的登陆方法!
            //BLLSession//数据仓储
            //到业务层查询,查到true,如果没查到返回false
            MODEL.Ou_UserInfo usr = OperateContext.Current.BLLSession.IOu_UserInfoBLL.Login(ModeLogin.LoginNames, ModeLogin.uPwd3);//扩展登录Login

            if (usr != null)
            {
                //2.1保存 用户数据(Session or Coookie)//为了安全考虑, MODEL.Ou_UserInfo代理类,改成真正的实体。再存入Cookie
                Usr = usr;//存入Usr对象
                if (!ModeLogin.isAllway)//如果选择了复选框,则使用cookie保存数据,要加密
                {
                    //2.1.2将用户id加密成字符串
                    string strCookieValue = Common.SecurityHelper.EncryptUserInfo(usr.uId.ToString());//调用票据加密
                    //2.1.3创建cookie
                    HttpCookie cookie = new HttpCookie(Admin_InfoKey, strCookieValue);//用户id存入Cookie
                    cookie.Path = Admin_CookiePath;// "/admin/";
                    cookie.Expires = DateTime.Now.AddDays(1);//失效时间是一天
                    Response.Cookies.Add(cookie);//发回去
                }
                //2.2查询当前用户的权限,并将权限存入 Session=================
                //List<MODEL.Ou_Permission> listPermission = MVCOA.Helper.OperateContext.GetUserPermission(usr.uId);//usr.uId是用户id
                //存入Session对象=================
                UsrPermission =OperateContext.Current.GetUserPermission(usr.uId);//GetUserPermission用户权限查询
                return true;

            }
            return false;
        } 
        #endregion

        #region 2.2 判断当前用户是否登陆 +bool IsLogin()
        /// <summary>
        /// 判断当前用户是否登陆 而且
        /// </summary>
        /// <returns></returns>
        public bool IsLogin()
        {
            //1.验证用户是否登陆(Session && Cookie)
            if (Seesion[Admin_InfoKey] == null)
            {
                if (Request.Cookies[Admin_InfoKey] == null)
                {
                    //重新登陆,内部已经调用了 Response.End(),后面的代码都不执行了! (注意:如果Ajax请求,此处不合适!)
                    //filterContext.HttpContext.Response.Redirect("/admin/admin/login");
                    return false;
                }
                else//如果有cookie则从cookie中获取用户id并查询相关数据存入 Session
                {
                    string strUserInfo = Request.Cookies[Admin_InfoKey].Value;
                    strUserInfo = Common.SecurityHelper.DecryptUserInfo(strUserInfo);
                    int userId = int.Parse(strUserInfo);
                    MODEL.Ou_UserInfo usr = BLLSession.IOu_UserInfoBLL.GetListBy(u => u.uId == userId).First();
                    Usr = usr;
                    UsrPermission = OperateContext.Current.GetUserPermission(usr.uId);//GetUserPermission用户权限查询
                }
            }
            return true;
        }
        #endregion

        #region  2.3 判断当前用户 是否有 访问当前页面的权限 +bool HasPemission
        /// <summary>
        /// 2.3 判断当前用户 是否有 访问当前页面的权限
        /// </summary>
        /// <param name="areaName"></param>
        /// <param name="controllerName"></param>
        /// <param name="actionName"></param>
        /// <param name="httpMethod"></param>
        /// <returns></returns>
        public bool HasPemission(string areaName, string controllerName, string actionName, string httpMethod)
        {
            //查询权限表(areaName:区域名; controllerName:控制器名; actionName:控制器Action方法名;httpMethod:请求方式:1Get,2Post)
            var listP = from per in UsrPermission
                        where
                            string.Equals(per.pAreaName, areaName, StringComparison.CurrentCultureIgnoreCase) &&       
                            string.Equals(per.pControllerName, controllerName, StringComparison.CurrentCultureIgnoreCase) &&
                            string.Equals(per.pActionName, actionName, StringComparison.CurrentCultureIgnoreCase) &&
                            //string.Equals(per.pFormMethod.ToString(),(httpMethod.ToLower()=="get"?1:2).ToString(),StringComparison.CurrentCultureIgnoreCase)
                            per.pFormMethod == (httpMethod.ToLower() == "get" ? 1 : 2)
                        select per;
           
            return  listP.Count()>0;  //这里有点问题,不知什么问题,暂时改成:return listP.Count()>
        }
        #endregion

        #region 2.4获取当前登陆用户的权限树Json字符串+string UserTreeJsonStr
        /// <summary>
        /// 获取当前登陆用户的权限树Json字符串
        /// </summary>
        public string UserTreeJsonStr
        {
            //3.1 从Session中获取权限
            get
            {
                if (Seesion[Admin_TreeString] == null)
                {
                    //将登录用户 权限集合 转成树节点 集合(IsShow = false的不要生成到树节点集合中)
                    List<MODEL.EasyUIModel.TreeNode> listTree = MODEL.Ou_Permission.ToTreenodes(UsrPermission.Where(p => p.pIsShow == true).ToList());
                    Seesion[Admin_TreeString] = Common.DBhelperD5.Obj2Json(listTree);//listTree转成json格式
                }

                return Seesion[Admin_TreeString].ToString();
            }

        } 
        #endregion

        //=====================公用操作方法=======================================================
        #region 3.1生成Json格式的返回值+ActionResult RedirectAjax(string statu, string msg, object data, string backurl)
        /// <summary>
        /// 生成Json格式的返回值
        /// </summary>
        /// <param name="statu"></param>
        /// <param name="msg"></param>
        /// <param name="data"></param>
        /// <param name="backurl"></param>
        /// <returns></returns>
        public ActionResult RedirectAjax(string statu, string msg, object data, string backurl)
        {
            MODEL.FormatModel.AjaxMsgModel ajax = new MODEL.FormatModel.AjaxMsgModel()
            {
                Statu = statu,
                Msg = msg,
                Data = data,
                BackUrl = backurl
            };
            JsonResult res = new JsonResult();
            res.Data = ajax;
            return res;

        }
      
        #endregion
      
       
       
        #region 3.2 重定向方法 根据Action方法特性  +ActionResult Redirect(string url, ActionDescriptor action)
          /// <summary>
          /// 重定向方法 有两种情况:如果是Ajax请求,则返回 Json字符串;如果是普通请求,则 返回重定向命令
          /// </summary>
          /// <returns></returns>
          public ActionResult Redirect(string url, ActionDescriptor action)
          {
              //如果Ajax请求没有权限,就返回 Json消息
              if (action.IsDefined(typeof(AjaxRequestAttribute), false)
              || action.ControllerDescriptor.IsDefined(typeof(AjaxRequestAttribute), false))
              {
                  return RedirectAjax("nologin","您没有登陆或没有权限访问此页面~~", null, url);
              }
              else//如果 超链接或表单 没有权限访问,则返回 302重定向命令
              {
                  return new RedirectResult(url);
              }
          }
          #endregion


       
    }
}

过滤验证用户登陆

using MVCOA.Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCOA.Login.Admin.Filters
{
   /// <summary>
   /// 管理员 身份验证 过滤器
   /// </summary>
  public  class LoginValidateAttribute:System.Web.Mvc.AuthorizeAttribute //表示一个特性,特性用于限制调用方操作方法的属性
    {
            #region 1.0 验证方法 - 在 ActionExcuting过滤器之前执行
        /// <summary>
        /// 验证方法 - 在 ActionExcuting过滤器之前执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            //1.如果请求的 Admin 区域里的 控制器类和方法,那么就要验证权限
           if (filterContext.RouteData.DataTokens.Keys.Contains("area")//当前请求匹配的 路由对象中 是否 有 area区域
                && filterContext.RouteData.DataTokens["area"].ToString().ToLower() == "admin")//监测区域名 是否为 admin
            {
                //2.检查 被请求的 方法 和 控制器是否有 Skip 标签,如果有,则不验证;如果没有,则验证
                if (!filterContext.ActionDescriptor.IsDefined(typeof(Common.Attributes.SkipAttribute), false) &&
                    !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(Common.Attributes.SkipAttribute), false))
                {
                    #region 1.验证用户是否登陆(Session && Cookie)
                    //1.验证用户是否登陆(Session && Cookie)
                    if (!OperateContext.Current.IsLogin())
                    {
                        filterContext.Result = OperateContext.Current.Redirect("/admin/admin/Login", filterContext.ActionDescriptor);
                    }
                    #endregion
                    #region //2.验证登陆用户 是否有访问该页面的权限
                    else
                    {
                        //2.获取 登陆用户权限
                        string strAreaName = filterContext.RouteData.DataTokens["area"].ToString().ToLower();
                        string strContrllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
                        string strActionName = filterContext.ActionDescriptor.ActionName.ToLower();
                        string strHttpMethod = filterContext.HttpContext.Request.HttpMethod;
                                                     //HasPemission是否有权限。
                        if (!OperateContext.Current.HasPemission(strAreaName, strContrllerName, strActionName, strHttpMethod))
                        {
                            filterContext.Result = OperateContext.Current.Redirect("/admin/admin/login?msg=noPermission", filterContext.ActionDescriptor);
                        }
                     
                    }
                    #endregion
                }

            }
        } 
        #endregion
    }
}

***********(登陆)过滤配置 APP_start

           FilterConfig.cs

 

using System.Web;
using System.Web.Mvc;

namespace MVCOA
{
    public class FilterConfig   //过滤配置
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new Login.Admin.Filters.LoginValidateAttribute());//使用管理员 身份验证 过滤器
        }
    }
}

 

 

 

运行结果:

posted @ 2017-03-22 16:15  狼牙者.net  阅读(639)  评论(0)    收藏  举报