【发布时间】:2014-02-06 20:59:47
【问题描述】:
限制对控制器的访问的正确方法是什么?
例如,我可能有“ProductReviewController”,我希望能够检查此控制器是否可在当前商店中访问并已启用。我不关注执行此操作的代码,但如果不满足此条件,我对阻止用户访问控制器的方法感兴趣。我希望请求继续进行,就好像控制器从未存在过一样(所以可能会抛出 404)。
到目前为止我的想法:
数据注释,即
[IsValidController]。我将从哪个Attribute类派生 - Authorize 似乎并不适合,我会将其与用户身份验证相关联。另外,我不确定如果不满足标准,正确的响应是什么(但我想这将取决于它所派生的Attribute)。我可以将此数据注释放在我的基本控制器上。如果控制器不符合我的标准,请在页面生命周期的较低位置查找并停止用户点击控制器。即创建我自己的控制器工厂,如第 7 点所述:http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx
最好的方法是什么?
注意:目前,我倾向于选项 1,并使用AuthorizeAttribute 与下面的代码类似。我觉得我在滥用AuthorizeAttribute。
public class IsControllerAccessible : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!CriteriaMet())
return false;
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
controller = "Generic",
action = "404"
})
);
}
}
【问题讨论】:
标签: asp.net-mvc controller data-annotations asp.net-mvc-5