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

标签 c# .net asp.net-mvc asp.net-mvc-3 razor

目前,我的 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/

相关文章:

c# - 使用不同的通用参数实现相同的通用接口(interface) 2 次

C# - 无法从 ResourceManager 获取字符串(从附属程序集)

c# - 在 MVC 和 Web Api 项目中将表添加到数据库

jquery - 我如何将对象数组从js发送到服务器?

css - 具有 Bootstrap 主题的 mvc 中的下拉列表

c# - 在 .NET 中动态添加引用

C#如何给JsonProperty设置多个名字?

c# - ASP.NET 身份验证 cookie

asp.net - Html.PagedListPager 上的 System.Web.Mvc.HtmlHelper<dynamic> 异常

html - 在运行时对 css 差异感到困惑