ASP.NET MVC权限设计实践:Action参数验证权限_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > ASP.NET MVC权限设计实践:Action参数验证权限

ASP.NET MVC权限设计实践:Action参数验证权限

 2013/7/19 20:58:02  蒋叶湖  博客园  我要评论(0)
  • 摘要:本节介绍:ASP.NETMVC权限设计实践:Action参数验证权限。在本节之前,我们希望用ASP.NETMVC设置出一个相对合成熟的权限系统。不过总有一些问题,困扰着我们,如:1.太过依赖ASP.NETMVC架构的权限设计,不通用。2.权限控制过于复杂。3.感觉比较莫名的纠心!我们先上一个模型:Role角色类。然后我们进行账号管理的代码控制:AccountController。CodehighlightingproducedbyActiproCodeHighlighter(freeware
  • 标签:.net ASP.NET MVC net 设计

 

class="Apple-style-span" style="font-size: 16px;"> 本节介绍:ASP.NET MVC权限设计实践:Action参数验证权限。

 在本节之前,我们希望用ASP.NET MVC设置出一个相对合成熟的权限系统。

 不过总有一些问题,困扰着我们,如:

 1.太过依赖ASP.NET MVC架构的权限设计,不通用。

 2.权限控制过于复杂。

 3.感觉比较莫名的纠心!

 

我们先上一个模型:Role角色类。

 

然后我们进行账号管理的代码控制:AccountController。

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6 using Domain;
7 using Repository;
8 using Moq;
9 using WebUI.Views.Account;
10
11 namespace WebUI.Controllers
12 {
13 publicclass AccountController : Controller
14 {
15 private IUserRepository<SysUser> _Repository;
16
17 //
18 // GET: /Account/
19 [HttpGet]
20 public ActionResult Login()
21 {
22 return View();
23 }
24
25 [HttpPost]
26 public ActionResult Login(Account_LoginVM FormUser)
27 {
28 //初始化模拟数据
29 this.initMockData();
30
31 SysUser DbUser =this._Repository.findByUserID(FormUser.UserID);
32
33 if (DbUser ==null)
34 {
35 HttpContext.Response.Write("不存在此用户!");
36 HttpContext.Response.End();
37 }
38 elseif (FormUser.UserPwd != DbUser.UserPwd)
39 {
40 HttpContext.Response.Write("密码错误");
41 HttpContext.Response.End();
42 }
43
44 HttpContext.Session["User"] = DbUser;
45
46 return RedirectToRoute(new { controller ="Home", action ="Index" });
47 }
48
49 privatevoid initMockData()
50 {
51 var mock =new Mock<IUserRepository<SysUser>>();
52
53 //角色链
54 var roleList=new List<UserRole>()
55 {
56 new UserRole()
57 {
58 Id=1,
59 RoleName="Register",
60 },
61 //暂时去掉Admin权限。
62 // new UserRole()
63 //{
64 // Id=2,
65 // RoleName="Admin",
66 //}
67 };
68
69 mock.Setup(m => m.findByUserID("HuntSoul"))
70 .Returns
71 (
72 new SysUser()
73 {
74 Id =1,
75 UserID ="HuntSoul",
76 UserPwd ="654321",
77 NickName ="BackDoor", //UI Modual,用于ACTION参数验证用的。
78 Roles = roleList
79 }
80 );
81
82 _Repository = mock.Object;
83 }
84 }
85 }
86

我们输入用户名和密码:

结果提示没有权限,这是因为过滤器对角色和用户账号进行了范围限制

 

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6 using WebUI.ActionFilter;
7
8 namespace WebUI.Controllers
9 {
10 [HandleError]
11 publicclass HomeController : Controller
12 {
13 //用户通用过滤器,可以配置角色和用户ID的权限组合来过滤。
14 [UserAuthorize
15 (
16 Roles =newstring[]{ "Admin"},
17 UserID=newstring[]{"Admin"}
18 )
19 ]
20 public ActionResult Index()
21 {
22 ViewData["Message"] ="Index Action 验证成功!";
23
24 return View();
25 }
26
27 //Action级别下参数过滤
28 [FilterByUserInfo
29 (
30 Roles=newstring[]{"Admin"}
31 )
32 ]
33 public ActionResult Manage(string Modual)
34 {
35 ViewData["Message"] ="模块进入验证成功!";
36
37 return View();
38 }
39 }
40 }
41

再往下看示例代码:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.Mvc;
6 using Domain;
7
8 namespace WebUI.ActionFilter
9 {
10 publicclass UserAuthorizeAttribute:ActionFilterAttribute
11 {
12 ///<summary>
13 /// 角色链
14 ///</summary>
15 publicstring[] Roles { get; set; }
16
17 ///<summary>
18 /// 用户ID链
19 ///</summary>
20 publicstring[] UserID { get; set; }
21
22 protected SysUser _User { get; set; }
23
24 publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
25 {
26 _User = HttpContext.Current.Session["User"] as SysUser;
27
28 var rolesResult = from a in _User.Roles
29 from b in Roles
30 where a.RoleName.Equals(b)
31 select a;
32
33 var userIDResult = from a in _User.UserID
34 from b in UserID
35 where a.Equals(b)
36 select a;
37
38 if (rolesResult.ToList().Count ==0&& userIDResult.ToList().Count ==0)
39 {
40 HttpContext.Current.Response.Write("没有权限!");
41 HttpContext.Current.Response.End();
42 }
43 }
44
45 publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
46 {
47 base.OnResultExecuted(filterContext);
48 }
49 }
50 }

 接着我们再登陆看看:[得去掉Admin角色的注释]

 

这次提示Index Action 验证成功!

下面再给出:针对特定的Action再写一个特定的过滤器去处理权限分配的示例代码:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5
6 namespace WebUI.ActionFilter
7 {
8 publicclass FilterByUserInfoAttribute:UserAuthorizeAttribute
9 {
10 publicoverridevoid OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
11 {
12 base.OnActionExecuting(filterContext);
13
14 //配置你想额外做参数权限控制的地方,有点别扭。
15 var moduel = filterContext.RouteData.Values["id"].ToString();
16
17 if (_User.NickName != moduel)
18 {
19 HttpContext.Current.Response.Write("没有权限!");
20 HttpContext.Current.Response.End();
21 }
22 }
23
24 publicoverridevoid OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
25 {
26 base.OnActionExecuted(filterContext);
27 }
28 }
29 }

本次ASP.NET MVC权限设计实践:Action参数验证权限一文就介绍到这里了。

发表评论
用户名: 匿名