Asp.net MVC自定义权限

MVC框架的一个很重要的优势在于可拓展性很高。权限的管理在每一个Web应用程序中都非常重要,虽然微软提供了Membership的默认权限设置,但在更多的情况下,Membership默认的权限设置并不能满足我们实际的需要。

下面本文将用一种简单的办法来自定义权限。

在MVC框架中,属性常用来限定控制器(Controller)的访问。所以我们首先从AuthorizeAttribute类中继承一个自定义的权限类。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MvcApplication_AuthorizeAttribute.Models
 8 {
 9     public class MyAuthAttribute : AuthorizeAttribute  
10     {
11         // 只需重载此方法,模拟自定义的角色授权机制  
12         protected override bool AuthorizeCore(HttpContextBase httpContext)
13         {
14             if (!httpContext.User.Identity.IsAuthenticated)//判断用户是否通过验证
15                 return false;
16             string[] StrRoles = Roles.Split(',');//通过逗号来分割允许进入的用户角色
17             if (string.IsNullOrWhiteSpace(Roles))//如果只要求用户登录,即可访问的话
18                 return true;
19             bool isAccess = JudgeAuthorize(httpContext.User.Identity.Name, StrRoles);
20             if (StrRoles.Length > 0 && isAccess) //先判断是否有设用户权限,如果没有不允许访问
21                 return false;
22 
23             return true;
24         }
25         /// <summary>
26         /// 根据用户名判断用户是否有对应的权限
27         /// </summary>
28         /// <param name="UserName"></param>
29         /// <param name="StrRoles"></param>
30         /// <returns></returns>
31         private bool JudgeAuthorize(string UserName, string[] StrRoles)
32         {
33             string UserAuth = GetRole(UserName);  //从数据库中读取用户的权限
34             return StrRoles.Contains(UserAuth,    //将用户的权限跟权限列表中做比较
35                              StringComparer.OrdinalIgnoreCase);  //忽略大小写
36         }
37 
38    
39 
40         // 返回用户对应的角色, 在实际中, 可以从SQL数据库中读取用户的角色信息  
41         private string GetRole(string name)
42         {
43             switch (name)
44             {
45                 case "aaa": return "User";
46                 case "bbb": return "Admin";
47                 case "ccc": return "God";
48                 default: return "Fool";
49             }
50         }  
51     }
52 }

以上的代码只是示例而已。你可以将实际的权限控制逻辑写在自定义的权限控制类(MyAuthAttribute)里面。如果在特定的业务过程中,用户没有访问权限,就返回false。然后我们要做的就是把这个类属性放在要控制的控制器(Controller)或者Action上面。代码如下所示。

1      [MyAuth(Roles = "User")] 
2         public ActionResult About()
3         {
4             return View();
5         }

这样,我们就完成了简单的自定义权限了。

本文示例代码

参考链接