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

本文关键字:控制器 访问 管理 用户 MVC | 更新日期: 2023-09-27 18:11:29

我们正忙于将遗留的ASP.NET web表单应用程序移植到MVC。某些模块的有效Authorize属性已正确设置完毕,但只有一个模块正在运行

因此,我们必须防止用户导航到不同的模块(这些模块已经存在,但还没有"活动"(。我们不想干预现有的Authorize属性,但用户目前不允许访问这些模块。

以下是我的想法和不足:

  1. Global.asax中,订阅Application_AuthenticateRequest并拥有"Live"控制器列表,检查请求URL,必要时抛出并重定向到"未授权页面"。但是,我将不得不手动考虑路由URL可能mysite/路由到mysite/Foo/Bar/的位置。

  2. 传统的web.config authorization可以用于这种情况吗?(这比数字1更容易维护,但网络上到处都是不要在MVC中这样做(

类似这样的东西,其中Customer是控制器:

<location path="Customer">
  <system.web>
    <authorization>
      <deny users="*" />
    </authorization>
  </system.web>
</location>
  1. 或者,大胆一试,从未激活的控制器中注释掉所有Authorize属性:(希望不要走这条路

如果能朝着更好的方向努力,我们将不胜感激。

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

您可以在这种情况下使用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());
}