Вы можете написать собственный атрибут Authorize, который вместо перенаправления будет напрямую отображать представление LogOn:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var viewResult = new ViewResult
{
ViewName = "~/Views/Account/LogOn.cshtml"
};
filterContext.Result = viewResult;
}
}
затем украсьте ваш HomeController этим:
[MyAuthorize]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
тогда вашему AccountController больше не нужно беспокоиться о ReturnUrls:
public class AccountController : Controller
{
[HttpPost]
public ActionResult LogOn(LogOnModel model)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
// TODO: obviously here instead of hardcoding the country and the city
// you might want to retrieve them from your backend given the username
return RedirectToAction("Index", "Home", new { country = "uk", city = "london" });
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
return View(model);
}
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
}
и, наконец, вам нужно изменить действие формы в ~ / Views / Account / LogOn.cshtml так, чтобы он указывал на правильный контроллер:
@using (Html.BeginForm("LogOn", "Account")) {
...
}
Вы можете оставить свои маршруты по умолчанию:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}