【问题标题】:MVC Manage users access to specific controllersMVC 管理用户对特定控制器的访问
【发布时间】:2015-09-07 13:40:04
【问题描述】:

我们正忙于将旧版 ASP.NET Web 表单应用程序移植到 MVC。一些模块已正确设置其有效的Authorize 属性,但只有 1 个模块上线

所以我们必须防止用户导航到不同的模块(这些模块在那里,但还没有“实时”)。我们不想干预现有的Authorize 属性,但用户目前不允许访问这些模块。

以下是我的想法和不足:

  1. Global.asax 订阅Application_AuthenticateRequest 并获得“实时”控制器列表,检查请求 URL 并在必要时抛出并重定向到“未授权页面”。但是,我将不得不手动考虑 routing 在哪里 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 属性:( 希望不要走这条路...

我们将不胜感激。

【问题讨论】:

  • 在 Web 配置中创建一个密钥,您可以在其中指定 Beta 阶段的控制器列表。在另一个属性(如 BetaAuthorizationAttribute)中获取该列表并将您的用户重定向到某处 stackoverflow.com/questions/1498727/…stackoverflow.com/questions/20123589/… 可能是您的一些参考
  • 感谢@RazvanDumitru,这是一个绝妙的主意。不幸的是,这意味着不得不更改现有的Authorize 属性,但一旦完成,我就可以轻松控制对实时与测试版或控制器的访问。

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


【解决方案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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2010-09-17
    • 2013-04-09
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多