Redirect (lativeUrl) перенаправление на неверный путь в IIS - PullRequest
6 голосов
/ 28 февраля 2012

В обычном AccountController в моем приложении MVC3, если установлено returnUrl (в моем случае я установил его вручную), оно вызовет Redirect(returnUrl).

Предположим, что мой обратный URL-адрес /Admin/HealthCheck (это действительно так). Когда я отлаживаю, я получаю URL как http://localhost:3279/Admin/HealthCheck от перенаправления вызова.

Затем я развернул свое приложение на http://localhost/Test. В этом случае Redirect(returnUrl) перенаправляет меня на http://localhost/Admin/HealthCheck, а не ожидаемый http://localhost/Test/Admin/HealthCheck.

Что здесь происходит? Как мне это исправить (если это поправимо)?

Ниже приведен фрагмент из (стандартного) MVC3 AccountController; Вы можете увидеть, где я получаю URL-адрес возврата из строки запроса (например, http://localhost/Test/LogOn?ReturnUrl=/Admin/HealthCheck, хотя и закодированный URL-адрес).

[HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    returnUrl = Request.Params["ReturnUrl"];

                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

Ответы [ 4 ]

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

(в моем случае я установил его вручную)

Вы фактически не показали, как происходит эта ручная настройка, но если вместо этого вы жестко закодировали URL-адрес, такой как /Admin/HealthCheckиспользование помощника URL для генерации этого URL, такого как Url.Action("HealthCheck", "Admin"), не ожидайте, что чудеса произойдут.

Ваш LogOn в порядке.Он делает то, что должен делать => он перенаправляет на URL, который передается в качестве аргумента.Ваша проблема заключается в том, как вы устанавливаете этот URL.

Вывод: в приложении ASP.NET MVC всегда используйте помощники по URL при работе с URL.Никогда не кодируйте их жестко.

1 голос
/ 02 сентября 2014

Вам необходимо использовать Request.UrlReferrer.AbsoluteUri

[HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        string refUri = Request.UrlReferrer.AbsoluteUri;

        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return Redirect(refUri + "#/account/login");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }
1 голос
/ 28 февраля 2012

Для вашего Test URL вам нужно установить ReturnUrl на Test/Admin/HealthCheck.

Обратите внимание на MSDN Reference на Controller.Redirect():

Создает объект RedirectResult, который перенаправляет на указанный URL.

Другими словами, если вы введете "/Admin/HealthCheck" в качестве параметра, это именно то место, где будет перенаправление.

0 голосов
/ 28 февраля 2012

Если ваш конечный домен будет www.domain.com/Test/Admin/HealthCheck, вы можете изменить виртуальный каталог для вашего проекта, чтобы вам не приходилось вносить изменения в URL при переключении между localhost и вашим реальным сервером.

Если вы используете Visual Studio, вы можете изменить виртуальный путь, назначенный вашему проекту, щелкнув проект в обозревателе решений и нажав клавишу F4.Откроется окно свойств проекта, в котором есть возможность изменить виртуальный путь.В вашем случае вы хотели бы изменить его на /Test.Вам все равно придется изменить свои URL-адреса, чтобы они содержали /Test.

Хотя, как указал Дарин, вам следует использовать помощники по URL-адресам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...