表单LoginUrl - 如何格式化以使用某个区域?

时间:2011-02-02 22:34:35

标签: asp.net-mvc-2 forms-authentication asp.net-mvc-routing

我在我的Web项目中添加了一个区域,我希望能够执行所有必要的身份验证任务。项目中的文件夹结构是:

- Solution
  - Web Project
    - Areas
      - Accounts
        - Controllers
            AccountController.cs

AccountController通常是LogOn(LogOnModel model, string returnUrl)行动。

AccountsAreaRegistration.cs是自动生成的路线:

context.MapRoute(
   "Accounts_default",
   "Accounts/{controller}/{action}/{id}",
   new { 
       action = "LogOn", 
       id= UrlParameter.Optional 
   }
);

我遇到的第一件事就是简单地将区域名称添加到web.config中的loginUrl属性中,让路由映射处理重定向 - 非常简单,我想:

<forms loginUrl="~/Accounts/Account/LogOn"
       timeout="2880" />

唯一的问题是它不起作用。我收到一条错误,说“无法找到”/ Accounts / Account / Logon“ - 或者我在loginUrl属性中输入的任何值。在我看来,我在Web.Config中指定的URL并没有通过路线表寻找匹配。

*注意:所有这些都是由我的其他控制器中某个操作的[Authorize]属性触发的。

修改

我找到的解决方法是将URL保留为默认值(“帐户/登录”),并在global.asax中添加另一个路由,将请求重定向到右侧区域:

routes.MapRoute("LogOn",
                "Account/LogOn/{id}",
                new { controller = "Account", 
                      action = "LogOn", 
                      id = UrlParameter.Optional}
).DataTokens.Add("area", "Accounts");

这可以完成工作,但我不知道这是否是解决问题的最佳方案。

2 个答案:

答案 0 :(得分:0)

您正在测试的控制器操作是否使用[授权]属性标记?

在请求授权操作后,哪个部分无效,某些操作的授权或路由到登录操作?

答案 1 :(得分:0)

我找到的解决方法是将URL保留为默认值(“帐户/登录”),并在global.asax中添加另一个路由,将请求重定向到右侧区域:

routes.MapRoute("LogOn",
            "Account/LogOn/{id}",
            new { controller = "Account", 
                  action = "LogOn", 
                  id = UrlParameter.Optional}
).DataTokens.Add("area", "Accounts");

这可以完成工作,但我不知道这是否是解决问题的最佳方案。

相关问题