Перенаправление на запрашиваемую страницу после аутентификации

Я работаю над приложением mvc.net, и я использую проверку подлинности на основе форм. Я хочу перенаправить пользователя на запрашиваемую им страницу после того, как он получит аутентификацию. Любая помощь будет оценена.

Ответ 1

Если вы создаете проект интернет-приложения ASP.NET MVC 3 или 4, он будет иметь полный пример использования возвращаемого URL-адреса при аутентификации.

Когда вы добавляете AuthorizeAttribute к контроллеру для принудительной аутентификации, он перенаправляет пользователя на ваш метод входа и автоматически добавляет параметр returnUrl. Оттуда вы должны отслеживать его, показывая свою регистрационную форму:

public ActionResult Login(string returnUrl)
{
     ViewBag.ReturnUrl = returnUrl;
     return View();
}

а затем добавьте его в свою коллекцию маршрутов в форме входа:

@*//ReSharper disable RedundantAnonymousTypePropertyName*@
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@*//ReSharper restore RedundantAnonymousTypePropertyName*@

}

После того, как пользователь отправит логин, предположив, что он аутентифицирован правильно, вы просто перенаправляете на returnUrl:

[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
     return RedirectToLocal(returnUrl);
}

Самая сложная часть - отслеживание ReturnUrl через последовательность GET/POST.

Если вы хотите увидеть, как работает AuthorizeAttribute, fooobar.com/info/460228/... показывает настройку returnUrl с исходным запросом.

Вам также необходимо убедиться, что вы вернули returnUrl на самом деле, это локальный URL-адрес, или вы уязвимы для открытых атак перенаправления. RedirectToLocal() - это вспомогательный метод из шаблона интернет-приложения MVC 4, который выполняет эту проверку:

private ActionResult RedirectToLocal(string returnUrl)
{
     if (Url.IsLocalUrl(returnUrl))
     {
          return Redirect(returnUrl);
     }
     else
     {
          return RedirectToAction("Index", "Home");
     }
}