MVC管理用户对特定控制器的访问权限

时间:2015-09-07 13:40:04

标签: c# asp.net asp.net-mvc authorization

我们正在忙着将传统的ASP.NET Web表单应用程序移植到MVC。某些模块已完成正确设置的有效Authorize属性,但只有1个模块正在运行

因此,我们必须阻止用户导航到不同的模块(在那里,但尚未“实时”)。我们不想干涉现有的Authorize属性,但用户目前不允许访问这些模块。

以下是我的想法和不足之处:

  1. Global.asax订阅Application_AuthenticateRequest并拥有“实时”控制器列表,检查请求网址并在必要时抛出并重定向到“未授权页面”。但是,我怎么会手动将路由纳入mysite/可能路由到mysite/Foo/Bar/的网址。

  2. 传统的web.config authorization是否可以用于此方案? (这比第1号更容易维护,但网络上充斥着不要在MVC中这样做

  3. 像这样,Customer是控制器:

    <location path="Customer">
      <system.web>
        <authorization>
          <deny users="*" />
        </authorization>
      </system.web>
    </location>
    
    1. 或者采取措施,注释掉控制器中不存在的所有Authorize属性:(希望不要沿着这条路走......)
    2. 任何推动更好的方向都会受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

你可以在这种情况下使用asp.net mvc过滤器。

    public class YourCustomFilter : IFilterProvider
    {
        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            List<Filter> result = new List<Filter>();

            var routeData = controllerContext.HttpContext.Request.RequestContext.RouteData;
            var controller = routeData.GetRequiredString("controller");
            var action = routeData.GetRequiredString("action");

            if (controller != "livecontrollername" && action != "liveactionname")
            {
                result.Add(new Filter(new YourCustomAuthorizeAttribute(), FilterScope.Global, null));
            }

            return result;
        }
    }

    public class YourCustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    { 
        //Do something to prevent user from accessing the controller here
    }

然后在Global.ascx,App_Start:

中注册此自定义过滤器
protected void Application_Start()
{
     FilterProviders.Providers.Add(new YourCustomFilter());
}