为什么需要
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
。如果我想拒绝获取请求,我将添加 HttpPost
属性。
MVC 默认为
DenyGet
来保护您免受涉及 JSON 请求的非常具体的攻击,以提高在允许 HTTP GET
暴露的影响发生之前就考虑到它们的可能性。
这与事后可能为时已晚的情况相反。
注意:如果您的操作方法不返回敏感数据,那么允许 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 程序员 程序员)(Kindle 位置 6014-6020)。沃克斯。点燃版。
相关 StackOverflow 问题
为了让自己更轻松,您还可以创建一个 actionfilter 属性
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“拒绝获取”
假设我们有如下方法
[HttpPost]
public JsonResult amc(){}
默认为“拒绝获取”。
在下面的方法中
public JsonResult amc(){}
当你需要允许get或使用get时,我们必须使用JsonRequestBehavior.AllowGet。
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);