Pourquoi Json Request Behavior
est-il nécessaire?
Si je veux restreindre les requêtes HttpGet
à mon action, je peux décorer l'action avec l'attribut [HttpPost]
.
Exemple:
[HttpPost]
public JsonResult Foo()
{
return Json("Secrets");
}
// Instead of:
public JsonResult Foo()
{
return Json("Secrets", JsonRequestBehavior.AllowGet);
}
Pourquoi [HttpPost]
n'est-il pas suffisant?
Pourquoi le cadre nous "bogue" avec le JsonRequestBehavior.AllowGet
pour chaque JsonResult
que nous avons. Si je veux refuser les requêtes get, je vais ajouter l'attribut HttpPost
.
MVC utilise par défaut DenyGet
pour vous protéger contre une attaque très spécifique impliquant des requêtes JSON, afin d'améliorer la probabilité que les implications de l'autorisation de HTTP GET
soient examinées avant de les autoriser.
Ceci est opposé à après quand il pourrait être trop tard.
Remarque: Si votre méthode d'action ne renvoie pas de données sensibles, vous devez autoriser le get.
Autres lectures de mon livre Wrox ASP.NET MVC3
Par défaut, l'infrastructure ASP.NET MVC ne vous permet pas de répondre à une demande HTTP GET avec une charge JSON. Si vous devez envoyer du JSON en réponse à un GET, vous devez explicitement autoriser ce comportement en utilisant JsonRequestBehavior.AllowGet en tant que deuxième paramètre de la méthode Json. Cependant, il est possible qu'un utilisateur malveillant puisse accéder à la charge utile JSON via un processus appelé détournement JSON. Vous ne souhaitez pas renvoyer d'informations sensibles à l'aide de JSON dans une requête GET. Pour plus de détails, voir le message de Phil sur http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ ou this SO post.
Haack, Phil (2011). ASP.NET MVC 3 professionnel (programmeur à programmeur Wrox) (emplacements Kindle 6014 à 6020). Wrox. Édition Kindle.
Question relative à StackOverflow
Pour vous faciliter la tâche, vous pouvez également créer un filtre d'action
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);
}
}
et utilisez-le sur votre action
[AllowJsonGet]
public JsonResult MyAjaxAction()
{
return Json("this is my test");
}
Par défaut, Jsonresult "Deny get"
Supposons si nous avons une méthode comme ci-dessous
[HttpPost]
public JsonResult amc(){}
Par défaut, il "Deny Get".
Dans la méthode ci-dessous
public JsonResult amc(){}
Lorsque vous devez permettregetget ou utiliser get, vous devez utiliser JsonRequestBehavior.AllowGet.
public JsonResult amc()
{
return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
Améliorant un peu la réponse de @Arjen de Mooij en rendant le AllowJsonGetAttribute applicable aux mvc-controllers (pas simplement aux méthodes d'action individuelles):
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);
}
}
Tu n'en a pas besoin.
Si votre action a l'attribut HttpPost
, vous n'avez pas besoin de vous préoccuper de la définition de JsonRequestBehavior
et d'utiliser la surcharge sans cela. Il y a une surcharge pour chaque méthode sans le JsonRequestBehavior
enum. Les voici:
sans 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);
avec 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);