2016-06-17 6 views
0

Это может быть глупый вопрос, но я об этом некоторое время думал об этом. Возможно, я забыл некоторые подробности о том, как все это работает, и, конечно же, я не тестировал этот сценарий.MVC AntiForgeryToken в вызове ajax и методе IsAjaxRequest()

Представьте себе простой пример JsonResult действия в проекте ASP.NET MVC, как это:

[HttpPost] 
[ValidateAntiForgeryToken] 
public JsonResult greetingMsg(string name, string timeOfDay) 
{ 
    if (!Request.IsAjaxRequest()) return null; 
    return Json(new { result = $"Hello {name}, good {timeOfDay}" }); 
} 

Конечно, мы должны отправить AntiForgeryToken в вызове Ajax, или этот метод не будет выполняться.

Этот метод JsonResult можно вызывать из любого места в Интернете, но он не удастся из-за того, что AntiForgeryToken не соответствует, верно? Хорошо, если мы выведем атрибут [ValidateAntiForgeryToken], будет ли выполняться этот метод при вызове другим сайтом в сети с помощью Ajax или вызовы Ajax могут быть успешными только при вызове в пределах одного и того же Интернета?

Спасибо.

ответ

0

Если вы удалите AntiForgeryToken, он будет работать в любом месте. если вы не ограничите свое приложение обработчиком делегирования или другим механизмом безопасности, который будет проверять происхождение. Но тогда вы также можете подделать его.

Мне пришлось найти решение аналогичной проблемы, когда они попросили AntiForgeryToken, но мы строили чистый JavaScript-интерфейс, поэтому ASP.NET MVC (веб-api на сервере и SPA на другом) не было. Единственный способ сделать его безопасным - ввести OAuth2 JWT. (так как эмитент подписан внутри токена JsonWebToken, вы не можете его подделать), то любой, кто хочет позвонить вашему api, должен иметь возможность получить от вас токен.