为什么需要JsonRequestBehavior ?

为什么需要Json Request Behavior ?

如果我想把HttpGet请求限制在我的动作上,我可以用[HttpPost]属性来装饰这个动作

例子:

[HttpPost]
public JsonResult Foo()
{
return Json("Secrets");
}


// Instead of:
public JsonResult Foo()
{
return Json("Secrets", JsonRequestBehavior.AllowGet);
}

为什么__abc0不够?< br > 为什么框架为我们拥有的每个JsonResult使用JsonRequestBehavior.AllowGet来“bug”我们。如果我想拒绝get请求,我将添加HttpPost属性

236575 次浏览

MVC默认为DenyGet,以保护您免受涉及JSON请求的非常特定的攻击,以提高允许HTTP GET暴露的影响在允许它们发生之前被考虑的可能性。

与之相对的是事后,那时可能已经太迟了。

注意:如果您的action方法不返回敏感数据,那么允许get应该是安全的。

进一步阅读我的Wrox ASP。NET MVC3书

默认情况下,ASP。NET MVC框架不允许您响应 带有JSON有效负载的HTTP GET请求。如果你需要发送JSON 响应GET时,您需要显式地允许行为通过 使用JsonRequestBehavior。AllowGet作为Json的第二个参数 方法。但是,恶意用户有可能获得访问 通过一个被称为JSON劫持的过程来获取JSON有效载荷。你不需要 想要在GET请求中使用JSON返回敏感信息。为 更多细节,请参阅Phil的帖子 http://haacked.com/archive/2009/06/24/json-hijacking.aspx/这篇SO帖子。

哈克,菲尔(2011)。专业的ASP。NET MVC 3 (Wrox Programmer to (Kindle位置6014-6020)。Wrox电台。Kindle版。< / p >

StackOverflow相关问题

对于最新的浏览器(从Firefox 21, Chrome 27或IE 10开始),这不再是一个漏洞

默认Jsonresult“Deny get”

假设我们有如下方法

  [HttpPost]
public JsonResult amc(){}

默认为“Deny Get”。

在下面的方法中

public JsonResult amc(){}

当你需要allowget或使用get时,我们必须使用JsonRequestBehavior.AllowGet。

public JsonResult amc()
{
return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}

为了让你自己更容易,你也可以创建一个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");
}

改进了@Arjen de Mooij的回答,使 AllowJsonGetAttribute适用于mvc-controllers(不仅仅是单个动作方法):

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