目前,我的 AdminController
上的所有方法都有 [Authorize]
属性,Logon
操作除外。
最干净的反转方式是什么,这样我就不必记住将属性添加到所有方法,而是只将属性添加到应该可用的方法没有登录?
将 Logon
操作移动到它自己的 Controller ,并将 [Authorize]
属性应用于 AdminController 类会更好吗?
最佳答案
在 ASP.NET MVC 3 中,您可以实现自定义全局 action filter provider :
public class MyProvider : IFilterProvider
{
public IEnumerable<Filter> 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<Filter>();
}
return new[]
{
new Filter(new AuthorizeAttribute(), FilterScope.Action, 0)
};
}
}
可以在Application_Start
中注册:
FilterProviders.Providers.Add(new MyProvider());
现在,如果您正在使用一些 DI 容器,例如 NInject,它支持 filter binding syntax这意味着您可以将内核配置为根据上下文动态注入(inject)过滤器。
这种方法的优点是现在无论将什么 Controller 或操作添加到您的应用程序 => 它都需要授权。
关于c# - 除了一个(登录)之外,保护 Controller 所有操作的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6376212/