Asp.Net MVC 权限控制(二):Controller级别控制

 续接上篇:Asp.Net MVC 权限控制(一):使用 Authorize Roles 简单实现

 

由于直接在Controller上标记角色名有很大的局限性,所以本示例使用 ActionFilterAttribute 进行权限拦截。

首先创建三类标记:

1. 匿名访问标记(AnonymousAttribute)
2. 登录用户访问标记(LoginAllowViewAttribute)
3. 权限验证访问标记(PermissionPageAttribute)

 

最重要的一个权限拦截:AuthorizeFilter,包括三步验证:

1. 是否为匿名访问,如果是匿名访问直接通过;
2. 是否为权限验证,通过查询登录时保存的Cookie进行验证;
3. 是否已登录,如果登录直接通过;

    /// <summary>
    /// 权限拦截
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class AuthorizeFilter : ActionFilterAttribute
    {
        /// <summary>
        /// 在执行操作方法之前由 ASP.NET MVC 框架调用。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //根据验证判断进行处理
            if (!this.AuthorizeCore(filterContext))
            {
                filterContext.RequestContext.HttpContext.Response.Redirect("~/Account/Login");
            }
        }


        /// <summary>
        /// //权限判断业务逻辑
        /// </summary>
        /// <param name="filterContext"></param>
        /// <param name="isViewPage">是否是页面</param>
        /// <returns></returns>
        protected virtual bool AuthorizeCore(ActionExecutingContext filterContext)
        {
            object[] filter;

            // 验证当前Action是否是匿名访问Action
            filter = filterContext.Controller.GetType().GetCustomAttributes(typeof(AnonymousAttribute), true);
            if (filter.Length == 1)
            {
                return true;
            }

            // 验证当前Action是否是权限控制页面Action
            filter = filterContext.Controller.GetType().GetCustomAttributes(typeof(PermissionPageAttribute), true);
            if (filter.Length == 1)
            {
                //获取 controllerName 名称
                var controllerName = filterContext.RouteData.Values["controller"].ToString();
                //获取ACTION 名称
                var actionName = filterContext.RouteData.Values["action"].ToString();

                var validateAuthorize = new ValidateAuthorize();
                return validateAuthorize.validate(controllerName);
            }

            // 验证当前Action是否是登录用户Action
            filter = filterContext.Controller.GetType().GetCustomAttributes(typeof(LoginAllowViewAttribute), true);
            if (filter.Length == 1)
            {
                return HttpContext.Current.User.Identity.IsAuthenticated;
            }

            throw new Exception("用户验证出错!");
        }
    }

  

用户登录后保存用户信息。

  [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            string UserData = "";
            var userName = model.UserName;
            if (userName == "admin")
            {
                UserData = "Log";
            }
            else if (userName == "in")
            {
                UserData = "Infrastructure";
            }
            else if (userName == "fl")
            {
                UserData = "FileLibrary";
            }

            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
            1,
            userName,
            DateTime.Now,
            DateTime.Now.AddMinutes(20),
            false,
            UserData//写入用户角色
            );

            string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

            System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);

            return RedirectToAction("Index", "Home");
        }

  

代码下载:AuthorizationProject.zip

 

Asp.Net MVC 权限控制(二):Controller级别控制,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。