2009-11-02 12 views
38

Program ASP.NET MVC 2.0 będzie teraz domyślnie zgłaszał wyjątek, gdy akcja podejmuje próbę zwrócenia JSON w odpowiedzi na żądanie GET. Wiem, że można to przesłonić dla metody metodą metody, używając JsonRequestBehavior.AllowGet, ale czy można ustawić na kontrolerze lub na wyższym poziomie (prawdopodobnie web.config)?Ustawienie globalne środowiska ASP.NET MVC 2.0 JsonRequestBehavior

Aktualizacja: Per komentarzu Leviego, to co skończyło się using-

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

Oto dobre wytłumaczenie dla względów bezpieczeństwa uzasadniające domyślne ograniczenie dostępu: http://haacked.com/archive/2009/06/25/json-hijacking.aspx –

+0

Czytając to wyjaśnienie, wydaje się, że istnieje prosty sposób na obejście problemu bez uciekania się do tego nie-RESTNEGO sposobu radzenia sobie z nim. –

Odpowiedz

26

ten, podobnie jak inne MVC-specyficznych ustawień, nie jest ustawiany poprzez web.config. Ale masz dwie opcje:

  1. Nadpisz Controller.Json (object, string, kodowanie) przeciążenie zadzwonić JSON (object, string, kodowanie, JsonRequestBehavior), przekazując JsonRequestBehavior.AllowGet jako ostatni argument. Jeśli chcesz, aby to dotyczyło wszystkich kontrolerów, zrób to wewnątrz abstrakcyjnej klasy kontrolera podstawowego, a następnie poproś wszystkie podklasy kontrolerów o tę klasę abstrakcyjną.

  2. Utwórz metodę rozszerzenia MyJson (ten kontroler, ...), który tworzy JsonResult i ustawia odpowiednie właściwości, a następnie wywołaj go ze sterownika za pomocą tego.MyJson (...).

4

MVC 2 blok Json dla żądań GET ze względów bezpieczeństwa. Jeśli chcesz zastąpić to zachowanie, sprawdź przeciążenie Json, które akceptuje parametr JsonRequestBehavior.

public ActionResult Index() 

{ 

    return Json(data, JsonRequestBehavior.AllowGet) 

} 
+9

To nie jest odpowiedź, to tylko przeprojektowanie pytania. –

0

Czy to jest problem bezpieczeństwa, który próbował rozwiązać MVC2? http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Jeśli tak, wygląda na to, że luka jest problemem tylko wtedy, gdy próbujesz wykonać wywołanie json na zewnętrzną stronę. Jeśli twoja aplikacja MVC2 wykonuje tylko wywołania json do twojej własnej strony internetowej (na przykład do wypełniania jqgrid), czy nie powinnaś być w stanie bezpiecznie zmienić wywołanie Jsona w swoim kontrolerze bazowym, aby zawsze pozwalać na uzyskanie?

+0

Podpisany blog jest poprawny. Jednak usterka zawsze stanowi problem, jeśli użytkownik musi się uwierzytelnić. – ReinierDG

21

Istnieje inna opcja. Użyj filtrów akcji.

Utwórz nową właściwość ActionFilterAttribute, zastosuj ją do kontrolera lub określonej akcji (w zależności od potrzeb). To powinno wystarczyć:

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

Następnie stosuje się go tak:

[JsonRequestBehavior] 
public class Upload2Controller : Controller 
+2

Może użyć globalnego filtra akcji w MVC 3 i nowszych, jeśli chcesz, aby to było stosowane wszędzie. –

0

Wystarczy zmienić kod JSON od:

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

do:

$.post("methodname/" + ID, null, function (data, textStatus) 
Powiązane problemy