除了一个(登录)之外,保护Controller中所有操作的最佳方法是什么?
目前我的AdminController
上的所有方法都有[Authorize]
属性,但Logon
操作除外。
反转这个的最简洁的方法是什么,所以我不必记住将属性添加到所有方法,而是仅将属性添加到应该可用的方法而不登录?
将Logon
操作移动到自己的控制器,并将[Authorize]
属性应用于AdminController类,我会更好吗?
在ASP.NET MVC 3中,您可以实现自定义全局操作筛选器提供程序 :
public class MyProvider : IFilterProvider { public IEnumerable GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var rd = controllerContext.RouteData; var controller = rd.GetRequiredString("controller"); if (string.Equals("admin", controller, StringComparison.OrdinalIgnoreCase) && string.Equals("logon", actionDescriptor.ActionName)) { return Enumerable.Empty (); } return new[] { new Filter(new AuthorizeAttribute(), FilterScope.Action, 0) }; } }
可以在Application_Start
注册:
FilterProviders.Providers.Add(new MyProvider());
现在,如果您正在使用某些DI容器(例如NInject),例如它支持filter绑定语法,这意味着您可以配置内核以根据上下文动态注入filter。
这种方法的优点在于,现在无需为您的应用程序添加什么控制器或操作=>它将需要授权。
我会按照您的建议将Logon操作移动到自己的控制器,并将[Authorize]属性应用于整个AdminController类。 这样更清洁,将来更容易维护。
使用web.config中的
元素可以实现此目的的另一种方法。 这是一个例子:
我通常做这样的事情:
[Authorize] public abstract class AdminController : Controller { }
并inheritance了命名约定:
public class UserAdminController : AdminController { }
VS:
public class UserController : Controller { }
您可以使用filter提供程序执行此操作。
Phill Haack在这里写了这篇文章