为MVC5中的操作授权参数

时间:2014-09-11 04:58:25

标签: asp.net-mvc asp.net-mvc-5 authorize-attribute

我通常需要授权在MVC5中的操作中的服务调用中评估特定参数。例如,假设我的行为是public ActionResult Edit(string partnerName)

今天,我总是通过评估if (!User.CanAccessPartnerModule(THIS_MODULE_ID, partnerName)) throw new UnauthorizedException();

来处理这个问题

但是,我希望能够做到这样的事情:

[Authorize(Roles = THIS_MODULE_ID)]
public ActionResult Edit([AuthorizePartnerModule(THIS_MODULE_ID)] string partnerName)
{
    ...
}

要清楚,1)我不认为AuthorizeAttribute如果按照我的设想实施是必要的,2)不存在的东西是AuthorizePartnerModuleAttribute。< / p>

是否有现成的属性或教程解释如何实现这一目标?如果没有,这是不可取的吗?

1 个答案:

答案 0 :(得分:4)

您可以通过创建 AuthorizeAttribute

的子类,使用自定义授权过滤器扩展授权
using System.Web;
using System.Web.Mvc;

namespace Filters 
{
     public class AuthorizePartnerModule : AuthorizeAttribute 
     {
         protected override bool AuthorizeCore(HttpContextBase httpContext)
         {
             // getting the parameter from the request
            string partnerName = httpContext.Request.Params["groupId"].ToString();

            // custom validation
            return User.CanAccessPartnerModule(THIS_MODULE_ID, partnerName);
         }
     }
}

然后,您可以使用以下方法验证您的操作方法:

[AuthorizePartnerModule(Roles = THIS_MODULE_ID)]
public ActionResult Edit(string partnerName)
{
    ...
}

另一种选择是创建自定义 ActionFilter IActionFilter 的实现)。 ActionFilter实现了两个方法:

  • OnActionExecuting 在操作方法
  • 之前执行 执行操作方法后立即执行
  • OnActionExecuted

因此,您可以使用以下内容进行必要的验证:

using System.Web.Mvc;

namespace Filters {
     public class AuthorizePartnerModule : FilterAttribute, IActionFilter 
     {

         public void OnActionExecuting(ActionExecutingContext filterContext) 
         {
            // getting the parameter from the request
            string partnerName = filterContext.ActionParameters["partnerName"].ToString();

            // custom validation
            if (!User.CanAccessPartnerModule(THIS_MODULE_ID, partnerName)) 
            {
                filterContext.Result = new HttpNotFoundResult();
            }
         }

         public void OnActionExecuted(ActionExecutedContext filterContext)
         {
             // do nothing
         }
     }
}

但是,在这种情况下,你必须这样验证:

[Authorize(Roles = THIS_MODULE_ID)]
[AuthorizePartnerModule]
public ActionResult Edit(string partnerName)
{
    ...
}