Настройка маршрута, когда у пользователя нет аутентифицированной проблемы - PullRequest
0 голосов
/ 12 февраля 2012

Раньше у меня была похожая проблема. Я создал asp mvc шаблон по умолчанию project и установил атрибут authorization на домашнем контроллере. Когда я запускаю приложение, URL-адрес:

http://localhost:48403/Account/LogOn?ReturnUrl=%2f

я пытаюсь получить только http://localhost:48403, когда пользователь не аутентифицирован, но мне просто не повезло с настройкой маршрутизации :( Я попытался поместить это в global.asax, но не повезло:

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

Это мое целое global.asax

routes.MapRoute("About", "About",
                 new { controller = "Home", action = "About" }
             );

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

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

1 Ответ

2 голосов
/ 12 февраля 2012

Вы можете написать собственный атрибут 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 }
    );
}
...