C# Asp.net mvc 2表单身份验证在iis 6上不起作用。需求有助于确定正确的路线

C# Asp.net mvc 2表单身份验证在iis 6上不起作用。需求有助于确定正确的路线,c#,asp.net,asp.net-mvc,asp.net-mvc-2,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 2,我正在尝试在将托管在IIS 6上的asp.net mvc 2应用程序中设置窗体身份验证。在我的路线中有一个问题,但我不能准确地指出它在哪里 下面是我用来通过IIS 6上的aspx处理路由mvc请求的路由条目。这些可能是正确的方法,也可能不是正确的方法,但它们目前确实在服务器上工作 routes.MapRoute( "Default", "{controller}.aspx/{action}/{id}", ne

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

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

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

        routes.MapRoute(
          "Root",
          "",
          new { controller = "Main", action = "LogOn", id = "" }
        );
我已经在主控制器上设置了[Authorize]属性

在我的web.config中,我有:

    <authentication mode="Forms">
        <forms  loginUrl="~/Main.aspx/LogOn" timeout="2880"/>
    </authentication>
将web.config修改为:

    <authentication mode="Forms">
        <forms  loginUrl="~/Login" timeout="2880"/>
    </authentication>
这是我开发的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);
            }
        }
returnUrl是Windows窗体身份验证的回溯。因为我似乎无法在这里工作,所以参数总是空的


如果您看到需要改进的特定领域,请对此进行评论。我正在尽我所能地阅读,并试图把事情做好,所以我非常感谢所有的意见。谢谢

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

那你可以做几件事

实际上,创建一个名为Login.aspx的ASP.NET页面,并将其放在文件夹的根目录中。身份验证也适用于mvc页面 将您的登录路径更改为

routes.maproteLogin,Login.aspx,新的{controller=Main,action=LogOn}

你也应该看看你在任何时候实际击中的路线

请记住,您在全球范围内编写路线的顺序很重要。当它找到一个有效的方法时,它会停止检查,所以你的“一网打尽”应该是最后一个。

我在编辑3中发布的详细信息总结了这个问题的解决方案。我感谢你对这个问题的所有意见,但我已经解决了。我本想让开箱即用的表单验证工作起来,但这个解决方案已经足够好了。如果我们转向IIS7,我认为所有这些都将变得毫无意义


再次感谢大家的帮助。

顺便说一句,除非您无法在服务器上设置通配符映射,否则没有必要包含.aspx…我建议您查看NerdDinner教程,并学习正确的方法。如果您有一个纯MVC应用程序,那么走这条路最终只会带来更多的痛苦。@will:我无法在服务器上设置通配符映射。我认为目前使用*.aspx扩展没有那么多不便。您定义为Root的路由可能是多余的;如果是这样的话,应该是这样的eliminated@Tahbaza:根路由不是冗余的。当应用程序根路径输入url时,它指示应用程序去哪里。我应该在Login.aspx页面中输入什么?我知道我在这里可能会感到非常困惑,但尽管使用了*.aspx路由映射,应用程序实际上并没有使用任何web表单。它完全是asp.NETMVC。在IIS 6中运行mvc的说明中说,可以将路由映射到aspx扩展以避免任何服务器端设置,这正是我在这里选择的。我有一个半工作的解决方案,我担心它更像是黑客而不是解决方案。我已经用细节更新了问题。
     [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
        }
        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);
            }
        }