Зачем нужен JsonRequestBehavior?
почему Json Request Behavior
нужен?
если я хочу ограничить HttpGet
запросы к моему действию я могу украсить действие с [HttpPost]
атрибут
пример:
[HttpPost]
public JsonResult Foo()
{
return Json("Secrets");
}
// Instead of:
public JsonResult Foo()
{
return Json("Secrets", JsonRequestBehavior.AllowGet);
}
почему бы и нет [HttpPost]
достаточно?
Почему фреймворк "жучит" нас с помощью JsonRequestBehavior.AllowGet
для каждого JsonResult
что у нас есть. Если я хочу отклонить запросы get, я добавлю .
5 ответов:
MVC по умолчанию
DenyGet
чтобы защитить вас от очень конкретной атаки, связанной с запросами JSON, чтобы улучшить liklihood, что последствия разрешенияHTTP GET
экспозиция рассматривается заранее, чтобы позволить им произойти.это противопоставляется впоследствии, когда может быть слишком поздно.
Примечание: Если ваш метод действия не возвращает конфиденциальные данные, то он должен быть безопасным, чтобы разрешить get.
дальнейшее чтение из моего Wrox ASP.NET MVC3 книга
по умолчанию, ASP.NET MVC framework не позволяет отвечать на запросы запрос HTTP GET с полезной нагрузкой JSON. Если вам нужно отправить JSON ответ на GET, вам нужно будет явно разрешить поведение с помощью используя JsonRequestBehavior.AllowGet в качестве второго параметра для Json метод. Тем не менее, есть вероятность, что злоумышленник может получить доступ к полезная нагрузка JSON через процесс, известный как захват JSON. Вы не хочу вернуться конфиденциальная информация с использованием JSON в запросе GET. Для более подробную информацию см. В посте Фила на http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ или это так пост.
Haack, Phil (2011). Профессионал ASP.NET MVC 3 (Wrox Programmer to Программист) (Kindle Locations 6014-6020). Издательства wrox. Kindle Edition.
связанный вопрос StackOverflow
чтобы сделать его проще для себя, вы также можете создать 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); } }
и использовать его на свое действие
[AllowJsonGet] public JsonResult MyAjaxAction() { return Json("this is my test"); }
по умолчанию Jsonresult "Deny get"
предположим, если у нас есть метод, как показано ниже
[HttpPost] public JsonResult amc(){}
по умолчанию это "запретить Get".
В приведенном ниже методе
public JsonResult amc(){}
когда вам нужно разрешить или использовать get, мы должны использовать JsonRequestBehavior.Разрешить.
public JsonResult amc() { return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet); }
улучшение ответа @Arjen de Mooij немного, сделав AllowJsonGetAttribute применимо к MVC-контроллерам (а не только к отдельным методам действий):
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); } }
вам это не надо.
если ваше действие имеет
HttpPost
атрибут, то вам не нужно беспокоиться с установкойJsonRequestBehavior
и использовать перегрузку без него. Существует перегрузка для каждого метода безJsonRequestBehavior
перечисление. Вот они:Без 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);
С 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);