Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC 3自定义授权_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc ASP.NET MVC 3自定义授权

Asp.net mvc ASP.NET MVC 3自定义授权,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我正在编写一个ASP.NET MVC 3应用程序,我有许多角色: 系统管理员、客户管理员、预算所有者、应用所有者 我知道我可以使用[Authorize(Roles=“…”)属性轻松限制对某些控制器(和操作方法)的访问 但是,有些授权并非纯粹基于角色,而是基于权限。例如,预算所有者只能访问分配给其成本中心的预算,而不能访问其他人的预算 目前,我在action方法中有一些代码来检查这一点: if(UserCapabilities.CanAccessBudget(budgetId)) { // g

我正在编写一个ASP.NET MVC 3应用程序,我有许多角色:

系统管理员、客户管理员、预算所有者、应用所有者

我知道我可以使用[Authorize(Roles=“…”)属性轻松限制对某些控制器(和操作方法)的访问

但是,有些授权并非纯粹基于角色,而是基于权限。例如,预算所有者只能访问分配给其成本中心的预算,而不能访问其他人的预算

目前,我在action方法中有一些代码来检查这一点:

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,ehehh:P非常好的方法:)将在我的项目中使用它!非常好!添加了一个用于传递“budgetId”参数名的构造函数,这将是完美的。