ASP.NET MVC:上下文敏感验证

时间:2010-01-16 18:45:23

标签: asp.net-mvc authentication authorization

我有很多动作方法,需要验证传递给动作的orderId的所有权,如:

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

验证orderId属于User.IdentityName的简单方法是什么,而不必一遍又一遍地复制/粘贴相同的行?

我尝试了ActionFilterAttribute,但它无法访问上下文(例如MyDatabase对象)。处理这个问题的好方法是什么?

2 个答案:

答案 0 :(得分:1)

您的控制器似乎可以访问您的上下文。因此,如果您使用实现IAuthorizationFilter的操作过滤器属性,则可以将filterContext.Controller方法中的OnAuthorization强制转换为您的控制器类型,并且能够首先执行您设置的操作。 (我认为这是要走的路!)

善,

答案 1 :(得分: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属性,并且您可以轻松地跨多个控制器使用此属性。