2010-01-16 61 views
1

我有行動的方法一堆需要驗證orderId傳遞到操作類似的所有權:ASP.NET MVC:上下文敏感的驗證

public ActionResult CancelOrder(int orderId) { 
    If (!MyDatabase.VerifyOwnership(orderId, User.Identity.Name) return View("You are an imposter!"); 
    // ... 
} 

什麼是一個簡單的方法來驗證orderId屬於User.IdentityName而不必一遍又一遍地複製/粘貼相同的行?

我試過ActionFilterAttribute但它沒有權限訪問上下文(例如,MyDatabase對象)。處理這個問題的好方法是什麼?

回答

1

「但它沒有上下文的訪問」

當然它的作用:

public class VerifyOwner : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var myController = (MyControllerType)filterContext.Controller; 

     if (!myController.MyDatabase.VerifyOwnership(orderId, User.Identity.Name) 
      //do what you do 

     base.OnActionExecuting(filterContext); 
    } 
} 

您只需將Controller屬性強制轉換爲您的控制器類型即可。這很容易,你有一個自定義的基礎控制器,所有你的控制器繼承。然後將該基本控制器設置爲具有MyDatabase屬性,並且您可以在多個控制器之間輕鬆使用該屬性。

1

您的控制器似乎有權訪問您的上下文。因此,如果您使用實現IAuthorizationFilter的操作篩選器屬性,則可以將OnAuthorization方法中的filterContext.Controller強制轉換爲您的控制器類型,並且能夠首先執行您的操作。 (我估計是要走的路!)

善良,

+0

我試圖避免下滑,但我想它比單身更好。 – 2010-01-16 19:15:24

+0

有一點要記住......如果你不使用IAuthorizationFilter,那麼同一個方法上的另一個過濾器就可以在你「你是冒名頂替者!」之前運行。過濾器;) – 2010-01-16 19:20:37