2014-09-11 77 views
2

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

今天,我通过一直在评估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

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

+0

是的,这是可能的覆盖'Authorize'属性。如果明天你没有得到答案,我会针对这个特定问题发布一些代码。 – Shoe 2014-09-11 05:13:29

+0

@Shoe谢谢...我不知道'AuthorizeAttribute'应用于参数... – 2014-09-11 06:33:17

回答

3

你可以通过创建一个子类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) 
{ 
    ... 
} 
+0

感谢您的详细解答。今天我会旋转。 – 2014-09-11 10:36:58