使用Asp.Net Mvc在Json.Net中等效的JsonRequestBehavior

时间:2012-03-16 13:48:41

标签: c# asp.net-mvc security json.net

自ASP.NET MVC2以来,当您尝试返回没有附加信息的Json结果时,会出现错误:

  

此请求已被阻止,因为在GET请求中使用此信息时,可能会向第三方网站披露敏感信息。

您现在必须将属性JsonRequestBehavior设置为值AllowGet

result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

read on a post这可以防止劫持。

我想知道是否有与Json.Net等效的方法来防止此类攻击。

这是我创建Json结果的代码:

  protected JsonNetResult JsonNet(object data)
  {
     JsonNetResult result = new JsonNetResult();

     result.Data = data;

     return result;
  }

如果你想知道我在哪里找到了JsonNetResult,here is a link

非常感谢。

1 个答案:

答案 0 :(得分:4)

您不需要它,因为在您显示的自定义JsonNetResult中没有这样的测试。因此,如果您使用GET调用该操作,您将永远不会得到像标准JsonResult那样的异常。

如果您需要,可以在自定义JsonNetResult属性上实现完全相同的属性。

public class JsonNetResult : ActionResult
{
    public JsonNetResult()
    {
        SerializerSettings = new JsonSerializerSettings();
        JsonRequestBehavior = JsonRequestBehavior.DenyGet;
    }

    public JsonRequestBehavior JsonRequestBehavior { get; set; }
    ....

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var httpMethod = context.HttpContext.Request.HttpMethod;

        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && 
            string.Equals(httpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("You can't access this action with GET");
        }

        ...
    }
}

如果您想明确允许此操作:

protected ActionResult JsonNet(object data)
{
    JsonNetResult result = new JsonNetResult();
    result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    result.Data = data;
    return result;
}