C# MVC自定义授权过滤器

授权过滤器要继承System.Web.Mvc命名空间下AuthorizeAttribute类,指定用户访问就是利用了Users属性,并由基类帮我们验证,只放指定Users用户通过;要实现自定义验证,重写下面的OnAuthorization和AuthorizeCore方法就可以了。

//OnAuthorization获取通过路由跳转的Action,并得到进入某Action视图所需权限列表

//AuthorizeCore获取登录用户的权限,查看是否包含在Action权限列表里面

namespace System.Web.Mvc
{
    //     指定对控制器或操作方法的访问只限于满足授权要求的用户。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    {
        //     初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。
        public AuthorizeAttribute();
        //     获取或设置有权访问控制器或操作方法的用户角色。
        public override object TypeId { get; }
        //     获取或设置有权访问控制器或操作方法的用户。
        public string Users { get; set; }
        //     在过程请求授权时调用。
        public virtual void OnAuthorization(AuthorizationContext filterContext);
        //     重写时,提供一个入口点用于进行自定义授权检查。
        protected virtual bool AuthorizeCore(HttpContextBase httpContext);
        //     处理未能授权的 HTTP 请求。。
        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
        //     在缓存模块请求授权时调用。。
        protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
    }
}
 [Authorize]
 [UserAuthorize(AuthorizationFailView = "Error")] //授权失败跳转Error视图
 public ActionResult Welcome()
   {
       return View();
   } 
public class UserAuthorize : AuthorizeAttribute
    {
        /// 
        /// 授权失败时呈现的视图
        /// 
        public string AuthorizationFailView { get; set; }

        /// 
        /// 请求授权时执行
        /// 
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.HttpContext.Response.Redirect("/Account/LogOn");
            }

            //获得url请求里的controller和action:
            string controllerName = filterContext.RouteData.Values["controller"].ToString().ToLower();
            string actionName = filterContext.RouteData.Values["action"].ToString().ToLower();
            //string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            //string actionName = filterContext.ActionDescriptor.ActionName;

            //根据请求过来的controller和action去查询可以被哪些角色操作:
            Models.RoleWithControllerAction roleWithControllerAction =
            SampleData.roleWithControllerAndAction.Find(r => r.ControllerName.ToLower() == controllerName &&
            r.ActionName.ToLower() == actionName);

            if (roleWithControllerAction != null)
            {
                this.Roles = roleWithControllerAction.RoleIds;     //有权限操作当前控制器和Action的角色id
            }

            base.OnAuthorization(filterContext);
        }
        /// 
        /// 自定义授权检查(返回False则授权失败)
        /// 
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {

            if (httpContext.User.Identity.IsAuthenticated)
            {
                string userName = httpContext.User.Identity.Name;    //当前登录用户的用户名
                Models.User user = SampleData.users.Find(u => u.UserName == userName);   //当前登录用户对象

                if (user != null)
                {
                    Models.Role role = SampleData.roles.Find(r => r.Id == user.RoleId);  //当前登录用户的角色
                    foreach (string roleid in Roles.Split(','))
                    {
                        if (role.Id.ToString() == roleid)
                            return true;
                    }
                    return false;
                }
                else
                    return false;
            }
            else
            {
                return false;     //进入HandleUnauthorizedRequest 
            }

        }

        /// 
        /// 处理授权失败的HTTP请求
        /// 
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

            filterContext.Result = new ViewResult { ViewName = AuthorizationFailView };

        }
    }


你可能感兴趣的:(MVC学习之旅)