为什么需要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
的{{1}}“提出错误”。如果我想拒绝获取请求,我会添加JsonResult
属性。
答案 0 :(得分:262)
MVC默认为DenyGet
,以保护您免受涉及JSON请求的特定攻击,以提高允许HTTP GET
曝光的影响在允许它们发生之前的可能性。
这可能为时已晚,这与之后相反。
注意:如果您的操作方法没有返回敏感数据,那么允许获取是安全的。
从我的Wrox ASP.NET MVC3书中进一步阅读
默认情况下,ASP.NET MVC框架不允许您响应 带有JSON有效负载的HTTP GET请求。如果你需要发送JSON 响应GET,您需要明确允许行为 使用JsonRequestBehavior.AllowGet作为Json的第二个参数 方法。但是,恶意用户有可能获得访问权限 JSON有效负载通过称为JSON Hijacking的进程。你不 想要在GET请求中使用JSON返回敏感信息。对于 更多细节,请参阅菲尔的帖子 http://haacked.com/archive/2009/06/24/json-hijacking.aspx/或this SO post.
哈克,菲尔(2011年)。专业的ASP.NET MVC 3(Wrox Programmer to 程序员)(Kindle地点6014-6020)。 Wrox的。 Kindle版。
相关的StackOverflow问题
答案 1 :(得分:52)
为了让自己更容易,您还可以创建一个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");
}
答案 2 :(得分:7)
默认Jsonresult“拒绝获取”
假设我们有以下方法
[HttpPost]
public JsonResult amc(){}
默认情况下,它是“拒绝获取”。
以下方法
public JsonResult amc(){}
当你需要允许或使用get时,我们必须使用JsonRequestBehavior.AllowGet。
public JsonResult amc()
{
return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
答案 3 :(得分:5)
通过制作@Arjen de Mooij的答案来改进 AllowJsonGetAttribute适用于mvc-controllers(不仅仅是单独的action-methods):
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);
}
}
答案 4 :(得分:2)
你不需要它。
如果您的操作具有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);