【问题标题】:MVC3 Area +Authorize attribute + Role strange issueMVC3区域+授权属性+角色奇怪问题
【发布时间】:2011-12-06 21:13:58
【问题描述】:

我真的不知道应该用什么标题来描述我的问题。为了简化我的问题。这是我的测试。我从头开始创建一个 mvc3 站点。然后我添加名为“admin”的区域。在 admin 内部,我有一个名为“Search”的控制器,并装饰了“Authorize”属性。然后我更改了我的 Global.ascx.cs 路由设置以附加我的控制器命名空间。现在我开始测试。

问题 1

当我访问http://localhost:xxx/Search 页面时,它会将我重定向回/Account/Logon 页面,这让我首先感到困惑,为什么它会将我重定向到登录页面?据我了解,它根本不应该到达管理员搜索控制器。如果我删除了 Authorize 属性,它会显示黄色屏幕,表示无法按预期找到视图。

问题 2

如果我添加带有角色的授权属性,例如(Roles="Admin"),然后我再次尝试访问搜索页面,无论登录成功与否,我总是会重定向回登录页面。为什么它不给我黄屏,因为我试图在主站点而不是管理区域请求搜索控制器索引视图。很混乱。

我是 MVC 开发的新手,有人可以就我的问题给我一个解决方案吗?

谢谢

Global.ascx.cs

        public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },                      
            new string[]{"TestAreaRouting.Controllers"}
          );

        }

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-3-areas


    【解决方案1】:

    您可以通过将UseNamespaceFallback 数据标记设置为false 来限制默认控制器工厂,使其仅在Global.asaxRegisterRoutes 方法中查看控制器的指定命名空间:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new string[] { "TestAreaRouting.Controllers" }
        ).DataTokens["UseNamespaceFallback"] = false;
    }
    

    如果您在请求 /search 时不这样做,则 admin 区域路由不匹配,因为 url 不以 Admin 前缀开头。

    所以它是匹配的默认路由。默认控制器工厂开始扫描程序集以查找派生自Controller 的名为SearchController 的类,并且因为它找到了它,所以它实例化它并使用它来服务请求。显然它没有找到相应的 Index 视图,因为它在 ~/Views/Search/Index.cshtml 中查找,这显然不存在。实际视图位于该区域内。

    现在我们已经将控制器限制在它们各自的位置,您可以使用 Authorize 属性来装饰它们,它的行为应该一致。

    【讨论】:

    • 嗨达林感谢您的解释。但我仍然对此感到困惑。首先你能解释一下为什么当我删除授权属性时,它不会过度扫描管理区域内的搜索控制器吗?
    • @Vincent,建议的代码不适合你吗?您对什么特别感到困惑?
    • 顺便说一句,darin,如果你有机会也可以帮忙解释一下我的另一个问题stackoverflow.com/questions/8219347/…
    • @Vincent,让我们先关闭这个。
    • 嗨达林,我认为路由调试让我很困惑。因为当我启用它并查看生成的 url 时,它显示 /admin/search/xxx 生成。而且我也没有意识到有这样的属性可以用来关闭过度扫描。你是英雄,现在你的回答很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2013-10-21
    • 2011-09-03
    • 2013-12-03
    • 1970-01-01
    相关资源
    最近更新 更多