Why is JsonRequestBehavior needed?

后端 未结 5 1140
[愿得一人]
[愿得一人] 2020-11-22 05:27

Why is Json Request Behavior needed?

If I want to restrict the HttpGet requests to my action I can decorate the action with the [Http

相关标签:
5条回答
  • 2020-11-22 05:58

    To make it easier for yourself you could also create an actionfilterattribute

    public class AllowJsonGetAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            var jsonResult = filterContext.Result as JsonResult;
    
            if (jsonResult == null)
                throw new ArgumentException("Action does not return a JsonResult, 
                                                       attribute AllowJsonGet is not allowed");
    
            jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;            
    
            base.OnResultExecuting(filterContext);
        }
    }
    

    and use it on your action

    [AllowJsonGet]
    public JsonResult MyAjaxAction()
    {
        return Json("this is my test");
    }
    
    0 讨论(0)
  • 2020-11-22 06:01

    MVC defaults to DenyGet to protect you against a very specific attack involving JSON requests to improve the liklihood that the implications of allowing HTTP GET exposure are considered in advance of allowing them to occur.

    This is opposed to afterwards when it might be too late.

    Note: If your action method does not return sensitive data, then it should be safe to allow the get.

    Further reading from my Wrox ASP.NET MVC3 book

    By default, the ASP.NET MVC framework does not allow you to respond to an HTTP GET request with a JSON payload. If you need to send JSON in response to a GET, you'll need to explicitly allow the behavior by using JsonRequestBehavior.AllowGet as the second parameter to the Json method. However, there is a chance a malicious user can gain access to the JSON payload through a process known as JSON Hijacking. You do not want to return sensitive information using JSON in a GET request. For more details, see Phil's post at http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ or this SO post.

    Haack, Phil (2011). Professional ASP.NET MVC 3 (Wrox Programmer to Programmer) (Kindle Locations 6014-6020). Wrox. Kindle Edition.

    Related StackOverflow question

    With most recents browsers (starting with Firefox 21, Chrome 27, or IE 10), this is no more a vulnerability.

    0 讨论(0)
  • 2020-11-22 06:03

    You do not need it.

    If your action has the HttpPost attribute, then you do not need to bother with setting the JsonRequestBehavior and use the overload without it. There is an overload for each method without the JsonRequestBehavior enum. Here they are:

    Without JsonRequestBehavior

    protected internal JsonResult Json(object data);
    protected internal JsonResult Json(object data, string contentType);
    protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);
    

    With JsonRequestBehavior

    protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
    protected internal JsonResult Json(object data, string contentType, 
                                       JsonRequestBehavior behavior);
    protected internal virtual JsonResult Json(object data, string contentType, 
        Encoding contentEncoding, JsonRequestBehavior behavior);
    
    0 讨论(0)
  • 2020-11-22 06:07

    Improving upon the answer of @Arjen de Mooij a bit by making the AllowJsonGetAttribute applicable to mvc-controllers (not just individual action-methods):

    using System.Web.Mvc;
    public sealed class AllowJsonGetAttribute : ActionFilterAttribute, IActionFilter
    {
        void IActionFilter.OnActionExecuted(ActionExecutedContext context)
        {
            var jsonResult = context.Result as JsonResult;
            if (jsonResult == null) return;
    
            jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        }
    
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            var jsonResult = filterContext.Result as JsonResult;
            if (jsonResult == null) return;
    
            jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            base.OnResultExecuting(filterContext);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 06:09

    By default Jsonresult "Deny get"

    Suppose if we have method like below

      [HttpPost]
     public JsonResult amc(){}
    

    By default it "Deny Get".

    In the below method

    public JsonResult amc(){}
    

    When you need to allowget or use get ,we have to use JsonRequestBehavior.AllowGet.

    public JsonResult amc()
    {
     return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
    }
    
    0 讨论(0)
提交回复
热议问题