¿Por qué se necesita JsonRequestBehavior?

¿Por qué se necesita Json Request Behavior ?

Si quiero restringir las solicitudes HttpGet a mi acción, puedo decorar la acción con el atributo [HttpPost]

Ejemplo:

 [HttpPost] public JsonResult Foo() { return Json("Secrets"); } // Instead of: public JsonResult Foo() { return Json("Secrets", JsonRequestBehavior.AllowGet); } 

¿Por qué no es [HttpPost] suficiente?
Por qué el marco “nos molesta” con JsonRequestBehavior.AllowGet para cada JsonResult que tenemos. Si deseo denegar las solicitudes de obtención, HttpPost atributo HttpPost .

MVC se predetermina a DenyGet para protegerlo contra un ataque muy específico que involucre solicitudes JSON para mejorar la probabilidad de que las implicaciones de permitir HTTP GET exposición HTTP GET se consideren antes de permitir que ocurran.

Esto se opone después cuando podría ser demasiado tarde.

Nota: Si su método de acción no devuelve datos confidenciales, entonces debería ser seguro permitir el get.

Lectura adicional de mi libro Wrox ASP.NET MVC3

De forma predeterminada, el marco MVC de ASP.NET no le permite responder a una solicitud HTTP GET con una carga útil JSON. Si necesita enviar JSON en respuesta a un GET, deberá permitir explícitamente el comportamiento utilizando JsonRequestBehavior.AllowGet como el segundo parámetro del método Json. Sin embargo, existe la posibilidad de que un usuario malintencionado pueda obtener acceso a la carga JSON a través de un proceso conocido como secuestro JSON. No desea devolver información confidencial utilizando JSON en una solicitud GET. Para obtener más información, consulte la publicación de Phil en http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ o esta publicación SO.

Haack, Phil (2011). Profesional ASP.NET MVC 3 (Progtwigdor Wrox para Progtwigdor) (Ubicaciones Kindle 6014-6020). Wrox. Versión Kindle.

Pregunta relacionada con StackOverflow

Con la mayoría de los navegadores recientes (comenzando con Firefox 21, Chrome 27 o IE 10), esto ya no es una vulnerabilidad.

Para que sea más fácil para usted también podría crear un 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); } } 

y úsala en tu acción

 [AllowJsonGet] public JsonResult MyAjaxAction() { return Json("this is my test"); } 

Por defecto, Jsonresult “Denegar obtener”

Supongamos que tenemos un método como el siguiente

  [HttpPost] public JsonResult amc(){} 

Por defecto es “Denegar Get”.

En el método a continuación

 public JsonResult amc(){} 

Cuando necesite permitir o usar get, debemos usar JsonRequestBehavior.AllowGet.

 public JsonResult amc() { return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet); } 

Mejorando un poco la respuesta de @Arjen de Mooij al hacer que AllowJsonGetAttribute sea aplicable a los controladores mvc (no solo a los métodos de acción individuales):

 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); } } 

No lo necesitas.

Si su acción tiene el atributo HttpPost , entonces no necesita preocuparse por establecer el JsonRequestBehavior y usar la sobrecarga sin él. Hay una sobrecarga para cada método sin la enumeración JsonRequestBehavior . Aquí están:

Sin 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); 

Con 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);