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) 
{ 
    //... 
} 
+0

dang ...你打败了我: - /当你在线时,我放弃尝试回答任何.NET问题Darin,eheheh:P虽然非常好的方法:)将在我们的项目中使用它! – balexandre 2011-05-13 08:24:58

+0

非常好!通过添加一个用于传递“budgetId”参数名的构造函数,它将是完美的。 – gw0 2011-09-02 12:42:12

倒不如把授权/重定向逻辑为ActionFilterAttribute,因为你正在寻找的权限(其基于动作参数,而不是纯粹基于用户占据哪个角色)。

尽管将逻辑重构为只能使用一次的属性会变得混乱(具有大量的属性)。