ASP.NET MVC 3定制授权
问题描述:
我写的ASP.NET MVC 3应用程序,我有很多角色:ASP.NET MVC 3定制授权
系统管理,客户管理,预算所有者,应用所有者
我知道,我可以使用[Authorize(Roles =“...”)]属性轻松地限制对某些控制器(和操作方法)的访问。
但是,某些授权不是纯粹基于角色,而是基于权限。例如,预算所有者应该只能访问分配给其成本中心的预算 - 而不是其他人的预算。
目前我的操作方法中的一些代码来检查这一点:
if(UserCapabilities.CanAccessBudget(budgetId))
{
// get budget and show view
}
else
{
// redirect to index action
}
这开始让我的代码凌乱,并检查安全的噩梦 - 因为我需要这么多的操作方法不同类型的授权检查。
,我有一个想法是写一些自定义属性,我可以用它来装饰我的行动方法和清理我的代码:
//
// GET: /Budgets/View/1
[CanAccessBudget]
public ActionResult View(int id)
{
//...
}
人怎么想的?编写自定义属性是最干净和最可维护的方法吗?
答
你可以写一个自定义的授权属性:
public class CanAccessBudgetAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (isAuthorized)
{
var request = httpContext.Request;
var budgetId = request.RequestContext.RouteData.Values["budgetId"]
?? request["budgetId"];
var currentUser = httpContext.User.Identity.Name;
return HasPermissionsForBudget(currentUser, budgetId);
}
return isAuthorized;
}
}
然后:
[CanAccessBudget]
public ActionResult View(int id)
{
//...
}
答
倒不如把授权/重定向逻辑为ActionFilterAttribute
,因为你正在寻找的权限(其基于动作参数,而不是纯粹基于用户占据哪个角色)。
尽管将逻辑重构为只能使用一次的属性会变得混乱(具有大量的属性)。
dang ...你打败了我: - /当你在线时,我放弃尝试回答任何.NET问题Darin,eheheh:P虽然非常好的方法:)将在我们的项目中使用它! – balexandre 2011-05-13 08:24:58
非常好!通过添加一个用于传递“budgetId”参数名的构造函数,它将是完美的。 – gw0 2011-09-02 12:42:12