Используя проверку подлинности с помощью форм в ASP.NET MVC при попытке снова войти на сайт, он помещает параметр ReturnUrl в строку запроса. Метод действия My Logon принимает строку returnUrl. Однако кажется, что строка returnUrl всегда равна нулю, даже если она явно присутствует в строке запроса. Есть мысли о том, почему это может быть так или о возможном исправлении?
ASP.NET MVC Login ReturnUrl всегда NULL?
Ответы (5)
Может быть, вы не включаете параметр ReturnURL
в атрибут действия формы входа в систему, тем самым отправляя сообщение по URL-адресу без этого параметра?
Это обычно происходит, когда вы используете одну общую форму входа, но вы явно указываете Controller и ActionMethod (что вызывает публикацию формы, но теряет строку запроса)
Чтобы уточнить, вот как должен выглядеть ваш код в вашей BeginForm:
Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })
РЕДАКТИРОВАТЬ: Это сделано специально, как упоминает RickAnd в комментариях ниже. Однако он не позволяет шаблону пользовательского интерфейса находиться в глубине сайта, нажимать «Вход в систему», а затем возвращаться на страницу, на которой вы были ранее, если это позволяет анонимным пользователям. Это часто запрашиваемый шаблон. Подход Дэвида Аллена к LogOff также отлично подойдет для чистого перенаправления при LogOn.
ReturnUrl
в 3-м параметре BeginForm не сработал при использовании POST.
- person Charles Burns; 03.06.2013
По сути, у Asp.net MVC есть некоторые скрытые функции. Например, когда вы передаете переменную id в действие контроллера, он интерпретирует id как идентификатор по умолчанию и помещает его в запрос браузера с косой чертой. Используя другое имя вместо id, мы увидим '?' а не косую черту. Из-за установки имени id для RegisterRoutes
метода в файле global.asax.
В этой задаче вы создали пользовательский передатчик данных для контроллера с помощью этого кода:
using(Html.BeginForm("LogOn", "Account", FormMethod.Post))
{
//form fields
}
Таким образом, Asp.net MVC игнорирует другие полезные данные, передаваемые в действие контроллера, и мы будем видеть returnUrl
всегда null
.
При этом Asp.net MVC работает правильно и returnUrl
смонтирован:
using(Html.BeginForm())
{
//form fields in LogOn View
}
Между прочим, когда мы используем настраиваемое действие, передающее данные контроллеру, мы должны передать другие данные вручную следующим образом:
using(Html.BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] }))
{
//form fields
}
Я могу думать о двух способах работы со сценариями входа и выхода. Дэйв Бир описал один из способов выше. Есть еще один подход, который работает во многих ситуациях. Я использовал его при написании учебника NerdDinner. Учебник предоставляет нам функцию выхода из системы, которая выводит вас из системы и отправляет домой. Я этого не хотел. Я хотел вернуться на страницу, на которой был до выхода из системы. Поэтому я изменил действие выхода из системы контроллера учетной записи, чтобы оно выглядело следующим образом
public ActionResult LogOff()
{
FormsService.SignOut();
return Redirect(Request.UrlReferrer.ToString());
}
Вы можете стать более привлекательным и передать returnUrl и протестировать его, если вы хотите переопределить это поведение. Но мне это не нужно. Этим достигается желаемый результат. Вход в систему может работать аналогично. Возможно, есть способы использовать инфраструктуру MVC, чтобы сделать это за меня, но пока я их не изучу, это ОЧЕНЬ просто и работает надежно.
Попробуйте следующее:
public static MvcForm BeginForm(this HtmlHelper htmlHelper, string id)
{
string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
TagBuilder tagBuilder = new TagBuilder("form");
tagBuilder.MergeAttribute("id", id);
tagBuilder.MergeAttribute("action", formAction);
tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(FormMethod.Post), true);
HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));
return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}
Сначала убедитесь, что вы установили URL-адрес входа в web.config, затем убедитесь, что ваша форма входа не содержит ничего похожего на действие, например:
Вид:
Если вы укажете действие, вы всегда получите нулевой URL-адрес для возврата:
Контроллер:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SignIn(string userName, string password, bool? rememberMe, string returnUrl)
{
}