2009-11-02 20 views
38

ASP.NET MVC 2.0 ahora, de forma predeterminada, lanzará una excepción cuando una acción intente devolver JSON en respuesta a una solicitud GET. Sé que esto se puede anular método por método usando JsonRequestBehavior.AllowGet, pero ¿es posible establecer en un controlador o superior (posiblemente el web.config)?ASP.NET MVC 2.0 JsonRequestBehavior Configuración global

Actualización: Por el comentario de Levi, esto es lo que terminó using-

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding) 
{ 
    return Json(data, contentType, JsonRequestBehavior.AllowGet); 
} 
+3

Aquí hay una buena explicación para los problemas de seguridad que justifique la restricción de obtención predeterminada: http://haacked.com/archive/2009/06/25/json-hijacking.aspx –

+0

Al leer esa explicación, parece que hay una forma trivial de eludir el problema sin recurrir a esta manera no RESTANTE de tratar con él. –

Respuesta

26

Este, al igual que otros ajustes MVC-específicas, no es ajustable a través Web.config. Sin embargo, usted tiene dos opciones:

  1. Sustituir el Controller.Json (Object, String, Encoding) sobrecargue llamar JSON (objeto, cuerda, Codificación, JsonRequestBehavior), pasando JsonRequestBehavior.AllowGet como último argumento. Si desea que esto se aplique a todos los controladores, haga esto dentro de una clase de controlador de base abstracta, luego tenga todos los controladores subclase de esa clase abstracta.

  2. Haga un método de extensión MyJson (este Controlador, ...) que crea un JsonResult y establece las propiedades apropiadas, luego llámelo desde su controlador a través de this.MyJson (...).

4

MVC 2 bloque Json para solicitudes GET por razones de seguridad. Si desea anular ese comportamiento, revise la sobrecarga de Json que acepta un parámetro JsonRequestBehavior.

public ActionResult Index() 

{ 

    return Json(data, JsonRequestBehavior.AllowGet) 

} 
+9

No es una respuesta, solo se trata de reformular la pregunta. –

0

¿Este es el problema de seguridad que MVC2 estaba tratando de resolver? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Si es así, parece que la vulnerabilidad es solo un problema si está tratando de hacer una llamada json a un sitio web externo. Si su aplicación MVC2 solo hace llamadas json a su propio sitio web (para llenar jqgrids, por ejemplo), ¿no debería poder anular de manera segura la llamada Json en su controlador base para permitir siempre obtener?

+0

La publicación de blog que ha vinculado es correcta. Pero la vulnerabilidad siempre es un problema si el usuario tiene que autenticarse. – ReinierDG

21

Hay otra opción. Use filtros de acción.

Cree una nueva ActionFilterAttribute, aplíquela a su controlador o una acción específica (según sus necesidades). Esto debería ser suficiente:

public class JsonRequestBehaviorAttribute : ActionFilterAttribute 
{ 
    private JsonRequestBehavior Behavior { get; set; } 

    public JsonRequestBehaviorAttribute() 
    { 
     Behavior = JsonRequestBehavior.AllowGet; 
    } 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var result = filterContext.Result as JsonResult; 

     if (result != null) 
     { 
      result.JsonRequestBehavior = Behavior; 
     } 
    } 
} 

luego aplicarlo como esto:

[JsonRequestBehavior] 
public class Upload2Controller : Controller 
+2

Podría usar un filtro de acción global en MVC 3 y superior si desea que esto se aplique en todas partes. –

0

Sólo cambia el código JSON de:

$.getJson("methodname/" + ID, null, function (data, textStatus) 

a:

$.post("methodname/" + ID, null, function (data, textStatus) 
Cuestiones relacionadas