[MVC學習心得]如何自訂Authorize
在MVC的 Action方法可以冠上Authorize的Attribute,並可以指定授權角色,來驗證使用者是否有權限執行 如:[Authorize(Roles="Admin")]
但若要動態指定Roles時,則會出現訊息 "錯誤 2 屬性引數必須是常數運算式、typeof 運算式或屬性參數型別的陣列建立運算式"
程式如下:
[Authorize(Roles=staticClass.GetCurrentRole())]
Ps:staticClass.GetCurrentRole()),此方法是在依照DB的資料來指定權限。
若想依照DB的資料來判斷權限,可以參考如下
1.新增一類別並繼承AuthorizeAttribute 並新增一自訂屬性PrgNo
public class MyCustomAuthorizeAttribute : AuthorizeAttribute
/// <summary> /// 程式編號 /// </summary> public string PrgNo
{ get;
set;
}
}
2.覆寫AuthorizeCore方法
protected override bool AuthorizeCore(HttpContextBase httpContext)
{ if (httpContext == null)
throw new ArgumentNullException("httpContext");
string[] users = Users.Split(',');
if (!httpContext.User.Identity.IsAuthenticated) return false;
//取得使用者的角色 FormsIdentity id = httpContext.User.Identity as FormsIdentity; FormsAuthenticationTicket ticket = id.Ticket;
string[] currentRoles = ticket.UserData.Split(',');
string roles = this.GetRolesByPrg();//取得程式允許的角色
foreach (string role in currentRoles)
{ if (roles.IndexOf(role) > -1) return true;
}
return false;
}
/// <summary> /// 依照程式編號取得授權角色 /// </summary> /// <returns></returns> string GetRolesByPrg() ...{ //testing code 不重要 //TODO:DB 邏輯 return "Admin,Manager";
}
3.在Action冠上自訂的AuthorizeAttribute
[MyCustomAuthorize(PrgNo="Kim110")] public System.Web.Mvc.ActionResult Index() { var result = this._productDAL.GetAllProducts(); return View(result); }
大功告成這樣就可以明確的指定Action對應到程式編號可以有哪些角色可以使用
範例檔案
MyCustomAuthorizeAttribute.zip
MDSN
http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/9b646099-67d8-4e42-b7b9-e2ba66e5a40d
參考文章
http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/