2014-09-11 63 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