Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC管理用户对特定控制器的访问_C#_Asp.net_Asp.net Mvc_Authorization - Fatal编程技术网

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

C# MVC管理用户对特定控制器的访问,c#,asp.net,asp.net-mvc,authorization,C#,Asp.net,Asp.net Mvc,Authorization,我们正忙于将传统ASP.NET web表单应用程序移植到MVC。一些模块正确设置了有效的授权属性,但只有一个模块开始运行 因此,我们必须防止用户导航到不同的模块(这些模块已经存在,但尚未“激活”)。我们不想干预现有的Authorize属性,但用户目前不允许访问这些模块 以下是我的想法和不足: 在Global.asax中订阅Application\u AuthenticateRequest并拥有一个“活动”控制器列表,检查请求URL,必要时抛出并重定向到“未授权页面”。但是,如果URL可以mysi

我们正忙于将传统ASP.NET web表单应用程序移植到MVC。一些模块正确设置了有效的
授权
属性,但只有一个模块开始运行

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

以下是我的想法和不足:

  • Global.asax
    中订阅
    Application\u AuthenticateRequest
    并拥有一个“活动”控制器列表,检查请求URL,必要时抛出并重定向到“未授权页面”。但是,如果URL可以
    mysite/
    路由到
    mysite/Foo/Bar/
    ,那么我将不得不手动考虑路由问题

  • 传统的
    web.config
    授权能否用于此场景?(这比1号更容易维护,但是web上到处都是不要在MVC中这样做)

  • 类似这样,其中
    Customer
    是控制器:

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

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

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

    在web配置中创建一个密钥,在其中指定Beta阶段的控制器列表。在另一个属性(如BetaAuthorizationAttribute)中获取该列表,并将用户重定向到某个位置,或者作为YouTunks@RazvanDumitru的参考,这是一个非常好的主意。这意味着必须更改现有的
    Authorize
    属性很幸运,但一旦完成,我可以轻松控制对live vs beta或控制器的访问。
    protected void Application_Start()
    {
         FilterProviders.Providers.Add(new YourCustomFilter());
    }