Эквивалент JsonRequestBehavior в Json.Net с Asp.Net Mvc - PullRequest
3 голосов
/ 16 марта 2012

Начиная с ASP.NET MVC2, при попытке вернуть результат Json без дополнительной информации вы получаете сообщение об ошибке:

Этот запрос был заблокирован, поскольку конфиденциальная информация может быть раскрыта сторонним веб-сайтам, когда она используется в запросе GET.

Теперь необходимо установить для свойства JsonRequestBehavior значение AllowGet:

result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

Я прочитал в сообщении , что это предотвращает угон.

Я хотел бы узнать, есть ли в Json.Net аналог для предотвращения атак такого типа.

Вот мой код для создания результата Json:

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

     result.Data = data;

     return result;
  }

И если вы хотите узнать, где я нашел JsonNetResult, вот ссылка .

Большое спасибо.

1 Ответ

4 голосов
/ 16 марта 2012

Вам это не нужно, потому что в кастомном JsonNetResult, который вы показали, такого теста нет.Таким образом, вы никогда не получите исключение, подобное тому, которое вы получите со стандартным JsonResult, если вы вызовете действие с помощью GET.

Если вы захотите, вы можете реализовать точно такое же свойство в своем пользовательском свойстве 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;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...