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 }
這樣,我們就完成了簡單的自定義權限了。