ASP.NET MVC 基于页面的权限管理

原创 2015年07月06日 23:04:10

ASP.NET MVC 中运用AOP的思想(Filter)来实现页面级别的权限。在每个页面里,我们再去管理更小级别的权限。

1.Models

1)PermissionItem

namespace AspNetMvcAuthDemo1.Models
{
    public class PermissionItem
    {
        public int ID { set; get; }

        public int PermissionID { set; get; }

        public string Name { set; get; }

        public string Route { set; get; }
    }
}
2)PermissionList

namespace AspNetMvcAuthDemo1.Models
{
    public class PermissionList
    {
        public int ID { set; get; }

        public int PermissionID { set; get; }

        public int UserID { set; get; }
    }
}
3)UrlAuthorizeEntities

namespace AspNetMvcAuthDemo1.Models
{
    public class UrlAuthorizeEntities
    {
        public IEnumerable<PermissionItem> PermissionItems = new List<PermissionItem> 
        {
            new PermissionItem{ ID = 1 , PermissionID = 1, Name = "Test Page 1", Route = "/Home/Page1" },
            new PermissionItem{ ID = 2 , PermissionID = 2, Name = "Test Page 2", Route = "/Home/Page2" },
            new PermissionItem{ ID = 3 , PermissionID = 3, Name = "Test Page 3", Route = "/Home/Page3" },
            new PermissionItem{ ID = 4 , PermissionID = 1, Name = "Test Page 4", Route = "/Home/Page4" },
            new PermissionItem{ ID = 5 , PermissionID = 2, Name = "Test Page 5", Route = "/Home/Page5" }
        };

        public IEnumerable<PermissionList> PermissionList = new List<PermissionList>
        {
            new PermissionList{ ID = 1 , PermissionID = 2, UserID = 1},
            new PermissionList{ ID = 2 , PermissionID = 3, UserID = 1},
        };
    }
}
2.账户帮助类-AccountHelper

包含两个方法,获取所有权限列表并缓存,获取用户权限并缓存。

namespace AspNetMvcAuthDemo1.UrlAuthorize
{
    /// <summary>
    /// Account Helper
    /// </summary>
    public static class AccountHelper
    {
        /// <summary>
        /// Get all permission list
        /// </summary>
        /// <returns>Permission List</returns>
        public static List<PermissionItem> GetPermissionItems()
        {
            if (HttpContext.Current.Cache["PermissionItems"] == null)
            {
                UrlAuthorizeEntities db = new UrlAuthorizeEntities();
                var items = db.PermissionItems.Where(c => c.PermissionID > 0).ToList();
                HttpContext.Current.Cache["PermissionItems"] = items;
            }

            return (List<PermissionItem>)HttpContext.Current.Cache["PermissionItems"];
        }

        /// <summary>
        /// Get User Permission
        /// </summary>
        /// <param name="userID">User ID</param>
        /// <returns>User Permission Array</returns>
        public static Int32[] GetUserPermission(int userID)
        {
            if (HttpContext.Current.Session["Permission"] == null)
            {
                UrlAuthorizeEntities db = new UrlAuthorizeEntities();
                var permissions = db.PermissionList.Where(c => c.UserID == userID).Select(c=>c.PermissionID).ToArray();
                HttpContext.Current.Session["Permission"] = permissions;
            }
            return (Int32[])HttpContext.Current.Session["Permission"];
        }
    }
}
3.Filter(AOP)-UrlAuthorizeAttribute

继承自AuthorizeAttribute,重写其OnAuthorization方法,实现AOP。

namespace AspNetMvcAuthDemo1.UrlAuthorize
{
    /// <summary>
    /// URL permission
    /// </summary>
    public class UrlAuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// Rewrite OnAuthorization
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //Get permission list
            List<PermissionItem> pItems = AccountHelper.GetPermissionItems();

            //Get current page permission ID,if items is null,the page you what to access has not been configed.
            var item = pItems.FirstOrDefault(c => c.Route == filterContext.HttpContext.Request.Path);

            if (item != null)
            {
                int[] permissions = AccountHelper.GetUserPermission(int.Parse(filterContext.HttpContext.Session["UserID"].ToString()));
                if (Array.IndexOf<Int32>(permissions, item.PermissionID) == -1)
                {
                    //have not permission
                    filterContext.HttpContext.Response.Write("You have no permission to access this page.");
                    filterContext.HttpContext.Response.End();
                }
            }
            else
            {
                //the page you what to access has not been configed.
                filterContext.HttpContext.Response.Write("The page you want to access has not been configed permission.");
                filterContext.HttpContext.Response.End();
            }
        }
    }
}
4.控制器

namespace AspNetMvcAuthDemo1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }

        public string Login()
        {
            HttpContext.Session["UserID"] = 1;
            return "Login success.";
        }

        [UrlAuthorize]
        public string Page1()
        {
            return "Page1";
        }

        [UrlAuthorize]
        public string Page2()
        {
            return "Page2";
        }

        [UrlAuthorize]
        public string Page3()
        {
            return "Page3";
        }

        [UrlAuthorize]
        public string Page4()
        {
            return "Page4";
        }

        [UrlAuthorize]
        public string Page5()
        {
            return "Page5";
        }

        [UrlAuthorize]
        public string Page6()
        {
            return "Page6";
        }
    }
}
6.Route Config

namespace AspNetMvcAuthDemo1
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Login", id = UrlParameter.Optional }
            );
        }
    }
}
效果:

1)访问:http://localhost:5598/Home/Page1,结果:You have no permission to access this page.

2)访问:http://localhost:5598/Home/Page2,结果:Page2

3)访问:http://localhost:5598/Home/Page3,结果:Page3

4)访问:http://localhost:5598/Home/Page4,结果:You have no permission to access this page.

5)访问:http://localhost:5598/Home/Page5,结果:Page5

6)访问:http://localhost:5598/Home/Page6,结果:The page you want to access has not been configed permission.

具体逻辑请参照代码进行推理。(UserID =1 的用户有2,3权限,而2,3权限可以看2,3,5页面,所以,只有访问2,3,5才是合法的,其他都是非法,Page6没有配置,也是非法的,只是返回的错误信息不同。)

备注:这个做法是源于看过的博客园里面一个仁兄的做法写的,忘记文章链接了,在此表示感谢。










asp.net权限控制的方式

我们在使用asp.net开发Web程序的时候经常
  • qq1010885678
  • qq1010885678
  • 2014年07月07日 09:41
  • 3449

【C#MVC4】菜单管理和访问权限分配(三)

若坚持反复研究之前的步骤,到了这里,相信你不再对C#MVC懵懵懂懂了。进行到这里也渐渐接触到核心了。不得不停下业务,单开一篇讲述一下我们这个Demo是如何加载菜单,显示到easyui的tree上面的。...
  • f627422467
  • f627422467
  • 2016年09月02日 00:08
  • 2299

mvc5+权限控制

  • 2015年10月27日 15:22
  • 38.21MB
  • 下载

mvc 权限

在ASP.NET MVC中,通过使用其所提供的内置 [Authorize] public ActionResult Index()   标记的方式,可以实现所标记的ACTION必须是认...
  • chihen
  • chihen
  • 2015年05月20日 19:58
  • 151

ASP.NET MVC程序权限控制解决方案(一)

1.  什么是权限?? l  权限跟用户登录是没有任何关系的,但是要用到用户的数据,权限就是在请求我们系统的一个服务(请求地址,请求方法,请求Action,请求WebService等)的时候,当在请...
  • yiwuxun
  • yiwuxun
  • 2014年10月29日 22:17
  • 2129

ASP.NET权限管理子系统

  • 2010年02月27日 23:53
  • 2.19MB
  • 下载

MVC5+EF6 入门完整教程12--灵活控制Action权限

大家久等了。 本篇专题主要讲述MVC中的权限方案。 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一。 前面的系列文章中我们用到了 SysUser, SysRole, S...
  • mss359681091
  • mss359681091
  • 2016年08月06日 13:43
  • 3747

mvc 权限控制

Entity代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using...
  • KingCruel
  • KingCruel
  • 2016年01月08日 15:11
  • 458

ASP.NET WebAPI+mvc4.0+EasyUI快速开发框架+通用权限管理系统源码

  • 2015年07月14日 09:46
  • 33.8MB
  • 下载

Asp.Net MVC4+EF6 Code First 权限管理系统 源码下载

  • 2014年05月01日 18:33
  • 56.92MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET MVC 基于页面的权限管理
举报原因:
原因补充:

(最多只允许输入30个字)