除了一个(登录)之外,保护Controller中所有操作的最佳方法是什么?

Dan*_*eny 4 .net c# asp.net-mvc razor asp.net-mvc-3

目前我[Authorize]对我的所有方法都有属性,AdminController除了Logon动作.

反转这个的最简洁的方法是什么,所以我不必记住将属性添加到所有方法,而是仅将属性添加到应该可用的方法而不登录?

Logon动作移动到自己的控制器,并将该[Authorize]属性应用于AdminController类,我会更好吗?

Dar*_*rov 8

在ASP.NET MVC 3中,您可以实现自定义全局操作筛选器提供程序:

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)
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

可以注册Application_Start:

FilterProviders.Providers.Add(new MyProvider());
Run Code Online (Sandbox Code Playgroud)

现在,如果您正在使用某些DI容器(例如NInject),例如它支持过滤器绑定语法,这意味着您可以配置内核以根据上下文动态注入过滤器.

这种方法的优点是,现在无需向您的应用程序添加什么控制器或操作=>它将需要授权.