[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/