当前位置:  开发笔记 > 编程语言 > 正文

重定向后HttpPost到ReturnURL

如何解决《重定向后HttpPost到ReturnURL》经验,为你挑选了2个好方法。

我正在编写一个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);
}

我的问题是,这将始终使用Get(HttpGet)请求,而我的原始提交是一个帖子(HttpPost),应该始终是一个帖子.任何人都可以建议一种传递此URL的方法,包括HttpMethod或任何解决方法,以确保使用正确的HttpMethod?



1> Darin Dimitr..:

没有简单的方法可以做到这一点.我建议您将未经身份验证的用户重定向到登录页面,而不是在发布到某个URL时,而是在请求将POST到经过身份验证的URL的表单时.

如果您知道您向未经身份验证的用户提交的表单将POST到网站的经过身份验证的部分,那么请不要向他提供表单.请求此表单时,只需重定向到登录页面进行身份验证,并在经过身份验证后重定向到原始表单.这样,您将确保只有经过身份验证的用户才能POST到受保护资源.

就自动POST请求而言(机器人,Web服务......)将简单的401状态代码返回给不提供凭证的请求应该绰绰有余.



2> Jab..:

我想我明白为什么您希望身份验证仅针对出价POST操作.出价需要登录,但任何未登录的用户都可以看到拍卖页面.就像ebay/amazon等一样.在您需要基于用户的付款或操作之前,一切都是可见的.

Request.UrlReferrer如果Request.RequestType是a,您可以将属性更改为返回登录页面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);
    }
}

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有