Я пытаюсь настроить проверку подлинности с помощью форм в приложении asp.net mvc 2, которое будет размещено на IIS 6. В маршрутизации есть проблема, но я не могу точно определить, где она находится.
Вот записи маршрута, которые я использую для маршрутизации запросов mvc через обработку aspx на IIS 6. Это может или не может быть "правильным" способом, но в настоящий момент они работают на сервере.
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>
Когда приложение запускается, загружается пустая страница. Страница буквально пуста. Я не нашел способа изменить loginUrl для фактического выполнения действия LogOn & View для моего главного контроллера.
Отредактировано
Так же, как к вашему сведению, я настроил свою маршрутизацию на основе этой статьи, чтобы маршрутизация mvc могла работать на IIS 6.
http://www.asp.net/mvc/tutorials/using-asp-net-mvc-with-different-versions-of-iis-cs
Я предполагаю, что проблема здесь в том, что настройки проверки подлинности окон не синхронизируются с настройкой маршрутов, поэтому приложение может работать на IIS 6 через расширение aspx.
У кого-нибудь есть мысли о том, как я могу это исправить?
Редактировать 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. На данный момент меня волнует только то, что пользователь вошел в систему. Для этого я перенес действия LogOn и LogOff в контроллер учетных записей. Я переназначил корневой путь, чтобы указать на этот контроллер. В моем пользовательском атрибуте 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] к главному контроллеру, и он гарантирует, что пользователь должен пройти аутентификацию.
Для любопытства и полноты этого сценария я использую следующий код в действии LogOn (репозиторий еще не готов, поэтому все жестко задано):
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 Forms. Поскольку я не могу заставить это работать здесь, параметр всегда будет нулевым.
Пожалуйста, критикуйте это, если видите конкретные области, требующие улучшения. Я читаю, что я могу, и пытаюсь сделать все правильно, поэтому все отзывы очень ценятся. Спасибо!