Подтвердить что ты не робот

ASP.NET MVC Login ReturnUrl всегда NULL?

Используя аутентификацию форм в ASP.NET MVC при попытке войти в сайт, он помещает параметр ReturnUrl в строку запроса. Мой метод действия входа принимает строку "returnUrl". Однако кажется, что строка returnUrl всегда является нулевой, даже если она явно находится в строке запроса. Любые мысли о том, почему это может быть так или возможно?

4b9b3361

Ответ 1

Может быть, вы не включаете параметр ReturnURL в свой атрибут действия формы входа, поэтому отправляете URL-адрес без этого параметра?

Ответ 2

Это имеет тенденцию происходить, когда вы используете одну общую форму входа в систему, но вы явно указываете Controller и ActionMethod (который вызывает сообщение формы, но проигрывает querystring)

Просто, чтобы уточнить, вот как выглядит ваш код в вашем BeginForm:

Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })

EDIT. Это по дизайну, как упоминает RickAnd в комментариях ниже. Однако это не позволяет шаблону пользовательского интерфейса быть глубоко на сайте, нажав на LogOn, а затем вернется к предыдущей странице, если это позволяет анонимным пользователям. Это обычно запрашиваемый шаблон. Подход Дэвида Аллена к LogOff также хорошо подойдет для чистого перенаправления в LogOn.

Ответ 3

В основном, у Asp.net MVC есть некоторые скрытые функции. Например, когда вы передаете переменную "id" в действие контроллера, он интерпретирует "id" как идентификатор по умолчанию и помещает его в запрос браузера с помощью косой черты. Используя другое имя вместо "id" , мы увидим '?' а не слэш. Из-за установки имени 'id' в методе RegisterRoutes в файле global.asax.

В этой задаче вы создали пользовательский прокси-контроллер данных с помощью этого кода:

using(Html.BeginForm("LogOn", "Account", FormMethod.Post))
{
//form fields
}

Итак, Asp.net MVC игнорирует другие полезные данные, чтобы перейти к действию контроллера, и мы увидим returnUrl always 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
}

Ответ 4

Есть два способа, с помощью которых я могу думать о сценариях входа в систему и выхода из системы. Дэйв Бир описал один из способов, выше. Существует другой подход, который работает во многих ситуациях. Я использовал его, когда закодировал учебник NerdDinner. Учебное пособие предоставляет нам функцию выхода из системы, которая выводит вас из системы и возвращает вас домой. Я этого не хотел. Я хотел вернуться на страницу, на которой я был, прежде чем я выйду. Поэтому я изменил действие выхода из аккаунта контроллера аккаунта таким образом, чтобы он выглядел следующим образом:

   public ActionResult LogOff()
    {
        FormsService.SignOut();
        return Redirect(Request.UrlReferrer.ToString());
    }

Вы можете получить fancier и передать в returnUrl и протестировать его, если вы хотите переопределить это поведение. Но мне это не нужно. Это достигает желаемого результата. Logon может работать аналогичным образом. Возможно, есть способы использовать структуру MVC для этого, но пока я не узнаю их, это ОЧЕНЬ просто и работает надежно.

Ответ 5

Попробуйте следующее:

        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, затем убедитесь, что ваша подпись не содержит ничего подобного, например:

Вид:

Если вы укажете действие, вы всегда получите null для URL-адреса возврата:

Контроллер:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SignIn(string userName, string password, bool? rememberMe, string returnUrl)
{
}