c# - para - ¿Por qué se necesita JsonRequestBehavior?
return json jsonrequestbehavior allowget); (5)
¿Por qué es necesario el 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 suficiente [HttpPost]
?
¿Por qué el marco nos " JsonRequestBehavior.AllowGet
" con el JsonRequestBehavior.AllowGet
para cada JsonResult
que tenemos? Si quiero denegar las solicitudes de obtención, HttpPost
atributo HttpPost
.
MVC DenyGet
por defecto DenyGet
para protegerlo contra un ataque muy específico que involucra solicitudes JSON para mejorar la probabilidad de que las implicaciones de permitir HTTP GET
exposición a HTTP GET
se consideren antes de permitir que ocurran.
Esto se opone a 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 acceso.
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 GET de HTTP con una carga JSON. Si necesita enviar JSON en respuesta a un GET, deberá permitir explícitamente el comportamiento utilizando JsonRequestBehavior.AllowGet como segundo parámetro del método Json. Sin embargo, existe la posibilidad de que un usuario malintencionado pueda obtener acceso a la carga útil de JSON a través de un proceso conocido como secuestro de JSON. No desea devolver información confidencial utilizando JSON en una solicitud GET. Para obtener más detalles, 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 (Programador a programador de Wrox) (Ubicaciones de Kindle 6014-6020). Wrox. Versión Kindle.
Preguntas relacionadas sobre
Mejorando un poco la respuesta de @Arjen de Mooij haciendo 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 configurar 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);
Para facilitarte la tarea, también puedes crear un atributo de filtro de acción.
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 usalo en tu accion
[AllowJsonGet]
public JsonResult MyAjaxAction()
{
return Json("this is my test");
}
Por defecto Jsonresult "Deny get"
Supongamos que si tenemos un método como el de abajo.
[HttpPost]
public JsonResult amc(){}
Por defecto es "Deny Get".
En el siguiente método
public JsonResult amc(){}
Cuando necesite permitir o usar get, tenemos que usar JsonRequestBehavior.AllowGet.
public JsonResult amc()
{
return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}