Как я должен использовать ReturnUrl = ViewBag.Returnurl в в MVC 4
Я работаю над 'ASP.NET приложение MVC 4'. Я использую / learning SimpleMembershipProvider и пытаюсь придерживаться логики по умолчанию, созданной VS2012
С Internet template
(если я не ошибаюсь, тот, с "SimpleMembershipProvider" из коробки).
Я застрял в AccountController
где я просто не могу понять, как именно я могу использовать этот метод:
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
насколько я понимаю вся идея в том, чтобы попадаете в место, откуда вы решили войдите в систему (именно то, что я хочу выполнить). Я посмотрел, как он используется в представлении:
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
искать место, где на самом деле ViewBag.ReturnUrl
устанавливается с некоторым значением, и я только получил этот метод здесь:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
и я довольно запутался в том, как именно я должен получить местоположение/url. Я поставил некоторые точки останова и я никогда не видел returnUrl
быть чем-то отличающимся от null
который в этом сценарии кажется мне довольно логичным, так как он не получает значение в любом месте (если я что-то пропустил конечно).
так что я действительно не могу понять, как это работает. Я публикую выше, чтобы показать, что я пытался сделать домашнее задание, я исследую столько, сколько мог, но я не нашел ответа, поэтому я спрашиваю здесь. Не могли бы вы дать объяснение/пример того, как это на самом деле работает?
3 ответов
при использовании проверки подлинности форм и пользователь не аутентифицируется или не авторизован ASP.NET конвейер безопасности перенаправит на страницу входа в систему и передаст в качестве параметра в строке запроса returnUrl равна страницу, перенаправляется на страницу входа. Действие login захватывает значение этого параметра и помещает его в ViewBag, чтобы его можно было передать в представление.
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
представление затем сохраняет это значение в форме, как показано в этой строке кода в Вид.
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
причина, по которой он хранится в представлении, заключается в том, что, когда пользователь делает отправку после ввода имени пользователя и пароля, действие контроллера, которое обрабатывает post back, будет иметь доступ к этому значению.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
Если состояние модели допустимо, и они аутентифицируются, вызывая безопасные переводы в интернете.Войти метод тогда он вызывает метод RedirectToLocal со значением returnUrl который пришел из вида, который первоначально пришел из действия входа в систему, создавшего представление.
на returnUrl значение будет равно null, если пользователь не перенаправлен на страницу входа в систему, как в случае, когда они просто нажимают на ссылку входа в верхней части страницы в макете по умолчанию. В этом случае пользователь будет перенаправлен на главную страницу после успешного входа в систему. Вся цель returnUrl автоматически отправлять пользователя обратно на страницу, к которой они пытались получить доступ до того, как они были аутентифицированы / авторизованы.
это потому, что по умолчанию ASP.NET шаблон MVC использует проверка подлинности с помощью форм, а контроллеры украшены :
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
[Authorize]
public class AccountController : Controller
{
//...
}
это означает, что если пользователь не прошел проверку подлинности, он будет перенаправлен на страницу входа в систему, указанный в атрибуте LoginUrl элемента формы.
во время перенаправления,FormsAuthentication
что это HttpModule
добавит url, который был запрошен в строке запроса автоматически.
Итак, если вы перейдете к /Account/Login
, вы ничего не получите в строке запроса, так как она украшена
когда неавторизованный пользователь пытается попасть в раздел вашего приложения, требующий аутентификации, тогда returnUrl
входит в картину. Url-адрес, запрошенный неавторизованным пользователем, в основном хранится в returnUrl
.
Вы можете пройти через учебник по PluralSight: создание приложений с помощью ASP.NET MVC 4