HttpPost к ReturnURL после перенаправления

Я пишу приложение ASP.NET MVC 2.0, которое требует, чтобы пользователи вошли в систему прежде, чем сделать ставку на объект. Я использую actionfilter, чтобы гарантировать, что пользователь зарегистрирован и, в противном случае отправьте их в страницу входа в систему и установите URL возврата. Ниже код, который я использую в своем фильтре действия.

if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
    filterContext.Result = new RedirectResult(String.Concat("~/Account/LogOn","?ReturnUrl=",filterContext.HttpContext.Request.RawUrl));
    return;
}

В моем контроллере входа в систему я проверяю пользовательские учетные данные, затем входят в систему их и перенаправление к URL возврата

FormsAuth.SignIn(userName, rememberMe);
if (!String.IsNullOrEmpty(returnUrl))
{
    return Redirect(returnUrl);
}

Моя проблема состоит в том, что это будет всегда использовать Получение (HttpGet) запрос, тогда как мое исходное представление было сообщением (HttpPost) и должно всегда быть сообщением. Кто-либо может предложить способ передать этот URL включая HttpMethod или какое-либо обходное решение, чтобы гарантировать, что корректный HttpMethod используется?

6
задан Deduplicator 1 February 2015 в 03:13
поделиться

2 ответа

Нет простого способа сделать это. Я бы посоветовал вам перенаправлять неаутентифицированных пользователей на страницу входа не при постинге на какой-то URL, а при запросе формы, которая будет POST на аутентифицированный URL.

Если вы знаете, что форма, которую вы предъявляете неаутентифицированному пользователю, будет POST на аутентифицированную часть сайта, не предъявляйте ему эту форму. Когда эта форма запрашивается, просто перенаправьте его на страницу входа для аутентификации, а после аутентификации перенаправьте на исходную форму. Таким образом вы обеспечите, чтобы только аутентифицированные пользователи выполняли POST на защищенный ресурс.

Что касается автоматических POST-запросов (боты, веб-службы, ...), то возврата простого кода состояния 401 для запросов, не предоставляющих учетные данные, должно быть более чем достаточно.

8
ответ дан 8 December 2019 в 13:44
поделиться

Думаю, я понимаю, почему вы хотите, чтобы аутентификация выполнялась только в действии POST ставки. Ставка требует входа в систему, но любой пользователь, не вошедший в систему, может увидеть страницу аукциона. Так же, как ebay / amazon и т. Д. Все видно до тех пор, пока вы не потребуете оплату или действие в зависимости от пользователя.

Вы можете изменить свой атрибут, чтобы вместо этого возвращать Request.UrlReferrer на страницу входа, если Request.RequestType представляет собой POST . Затем они будут перенаправлены на страницу аукциона и смогут снова нажать кнопку ставки после входа в систему. Вы даже можете передать определенное поле, например сумму, с помощью UrlReferrer , чтобы вы могли повторно указать сумму поле, как только они попадают на страницу аукциона. Вы можете получить это поле из коллекции Request.Form .

// in usage...    
[RequireLogin(AdditionalFields="amount,someotherfield")]
[HttpPost]
public ActionResult Bid(.....)

// the attribute 
class RequireLoginAttribute : ActionFilterAttribute
{
    public string AdditionalFields { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            var returnUrl = filterContext.HttpContext.Request.RawUrl;
            if (filterContext.HttpContext.Request.RequestType == "POST")
            {
                returnUrl = filterContext.HttpContext.Request.UrlReferrer.PathAndQuery;
                // look for FORM values in request to append to the returnUrl
                // this can be helpful for a good user experience (remembering checkboxes/text fields etc)
            }

            filterContext.Result = new RedirectResult(String.Concat("~/Account/LogOn", "?ReturnUrl=", returnUrl));
            return;
        }
        base.OnActionExecuting(filterContext);
    }
}
7
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: