Как я должен использовать 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