小白之AuthorizeAttribute权限控制(一)

web网站一般都需要做访问权限控制,把项目中使用的方式记录一下,也是第一次使用,作为知识积累吧。

项目是基于.NET的EF+MVC 框架,权限控制在Filters中去处理,该文件夹与Controller同级。

大致的流程:
当web请求访问某个被Attribute标记的controller或action时,就会先进入Filters中权限处理层,根据是否处理结果决定是或否有权限访问。一般没有权限时,会重定向到提示没有权限的页面或者登录页面。

现在 先自定义一个FunctionAttribute,继承 Attribute, 用于贴上需要做授权控制的方法上

   public class FunctionAttribute:Attribute
    {
        public FunctionAttribute()
        {
        }
        public FunctionAttribute(string name)
        {
            this.Name = name;
        }
        public string Module { get; set; }

        public string Code { get; set; }

        public string Name { get; set; }

        public string Message { get; set; }
    }

然后再定义一个 SystemAuthorizeAttribute,继承 AuthorizeAttribute,并重写里面需要用到的方法

  public class SystemAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
           {
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    var loginUrl = "/Portal/account/login";
                    filterContext.Result = new RedirectResult(loginUrl);
                }
            }
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return base.AuthorizeCore(httpContext);
        }
    }

权限控制的逻辑代码在OnAuthorization 方法中处理,如果验证不通过,则重定向到指定的页面。

ok,还差最后一步,我们把特性贴在需要用的地方:

     [Function(Module = "客户")]
        [SystemAuthorize]
        public ActionResult Index()
        {
            return View();
        }

在方法上面加的[SystemAuthorize],当被访问时,会先进入SystemAuthorizeAttributeOnAuthorization方法,该方法没有方法值,如果不被重定向到其他页面,也就意味着没有被拦截,就会继续访问Index 方法,然后客户端就看到Home页面啦。

涉及到的知识点还有更多,后面再陆续更新关于权限控制的内容

你可能感兴趣的:(MVC)