除了一个(登录)之外,保护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在这里写了这篇文章