代码之家  ›  专栏  ›  技术社区  ›  jason

ASP.NET MVC 2窗体身份验证在IIS 6上不起作用。需要帮助确定正确的路线

  •  1
  • jason  · 技术社区  · 16 年前

    我正在尝试在将托管在IIS 6上的ASP.NET MVC 2应用程序中设置窗体身份验证。我的路线中有个问题,但我不能准确地指出它在哪里。

    下面是我用来路由MVC请求的路由条目,它们通过在IIS6上的ASPX处理。这些方法可能是正确的,也可能不是正确的,但它们目前确实在服务器上工作。

            routes.MapRoute(
                "Default",
                "{controller}.aspx/{action}/{id}",
                new { action = "LogOn", id = "" }
              );
    
            routes.MapRoute(
              "Root",
              "",
              new { controller = "Main", action = "LogOn", id = "" }
            );
    

    我在主控制器上设置了[授权]属性。

    在我的web.config中,我有:

        <authentication mode="Forms">
            <forms  loginUrl="~/Main.aspx/LogOn" timeout="2880"/>
        </authentication>
    

    当应用程序启动时,将加载空白页。这一页字面上是空白的。我还没有找到修改LoginURL的方法来实际执行主控制器的登录操作和视图。

    编辑

    作为一个参考,我已经基于本文设置了我的路由,以便MVC路由可以在IIS6上工作。

    http://www.asp.net/mvc/tutorials/using-asp-net-mvc-with-different-versions-of-iis-cs

    我猜这里的问题是Windows窗体身份验证设置没有与路由设置同步,因此该应用程序可以通过ASPX扩展在IIS 6上运行。

    有人想我怎么解决这个问题吗?

    编辑2

    尝试添加以下路由:

            routes.MapRoute(
                "Login",
                "Login",
                new { controller = "Main", action = "LogOn" }
              );
    

    将web.config修改为:

        <authentication mode="Forms">
            <forms  loginUrl="~/Login" timeout="2880"/>
        </authentication>
    

    结果是和我最初得到的一样的白屏。似乎根本无法处理页面。从生成的页面查看源代码完全没有显示……没有标记……没有HTML声明……只是什么都没有。

    编辑3

    似乎我无法通过web.config使用默认表单身份验证配置正确的路由。为了避免这种情况,我创建了自己的authorize属性类。目前,我只关心用户已经登录系统。为了解决这个问题,我将登录和注销操作移动到了一个帐户控制器。我重新映射了根路径指向这个控制器。在我的自定义授权属性中,我检查用户是否登录,如果没有,则将其重定向回登录页面。代码如下:

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Account", action = "LogOn", id = "" }
            );
    

    这是我驱动的RequireLoginAttribute类的代码。

         [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
            public class RequireLoginAttribute : AuthorizeAttribute, IAuthorizationFilter
            {
                #region IAuthorizationFilter Members
    
                public override void OnAuthorization(AuthorizationContext filterContext)
                {
                    if (!filterContext.HttpContext.Request.IsAuthenticated) 
                    {   
                        //This didn't work...it would try routing to urls like
                        //http://localhost:1524/Main.aspx/Account.aspx/Logon
                        //new RedirectResult("Account.aspx/Logon");
    
                        //This seems sloppy to me somehow, but it works.
                        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "LogOn" }));
                    }
    
                }
    
                #endregion
            }
    

    现在,我可以将[RequireLogin]属性应用到主控制器,它确保用户必须经过身份验证。

    出于对这个场景的好奇和完整性的考虑,我在登录操作中使用了以下代码(存储库还没有准备好,所以事情是硬编码的):

            public ActionResult LogOn(LogOnModel login, String returnUrl)
            {
                if (ModelState.IsValid)
                {
                    FormsAuthentication.SetAuthCookie(login.UserName, false);
                    return Redirect(returnUrl ?? Url.Action("NextPage", "Main"));
                }
                else
                {
                    return View(login);
                }
            }
    

    返回URL是对Windows窗体身份验证的回归。因为我在这里似乎不能让它工作,所以参数将始终为空。

    请批评这一点,如果你看到具体领域需要改进。我在读我能读的,并努力做正确的事情,所以所有的输入都非常感谢。谢谢!

    2 回复  |  直到 13 年前
        1
  •  0
  •   MarkKGreenway    16 年前

    如果需要.aspx作为默认根目录,那么为什么不需要它作为登录路径呢?

    那你可以做几件事

    1. 实际上,创建一个名为login.aspx的ASP.NET页面,并将其放在文件夹的根目录中(验证也适用于MVC页面)
    2. 更改登录路径

      routes.maproute(“登录”,“login.aspx”,new controller=“main”,action=“logon”);

    3. 你也应该看看,看看你在任何时候实际的击球路线。

      http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

    记住,你在全球事务中的路线顺序。当它找到一个有效的,它就会停止检查,所以你的捕获应该是最后一个。

        2
  •  0
  •   jason    16 年前

    我发布的详细信息 编辑3 总结这个问题的解决方案。我很感激你对这个问题的所有意见,但我已经解决了。我本想让“开箱即用”的表单认证工作正常,但这个解决方案服务得很好。如果我们搬到IIs7,我想这一切无论如何都会变得毫无意义。

    再次感谢你们的帮助。