我正在尝试在将托管在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窗体身份验证的回归。因为我在这里似乎不能让它工作,所以参数将始终为空。
请批评这一点,如果你看到具体领域需要改进。我在读我能读的,并努力做正确的事情,所以所有的输入都非常感谢。谢谢!