MVC在ajax调用和IsAjaxRequest()方法中的AntiForgeryToken

时间:2016-06-17 18:29:23

标签: c# jquery asp.net ajax asp.net-mvc

这可能是一个愚蠢的问题,但我已经考虑了一段时间了。也许我忘了关于这一切是如何工作的一些细节,当然,我还没有测试过这种情况。

想象一下ASP.NET MVC项目中的一个简单的JsonResult动作示例,如下所示:

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

当然,我们应该在Ajax调用中发送AntiForgeryToken,否则这个方法将不会执行。

这个JsonResult方法可以从Web上的任何地方调用,但由于AntiForgeryToken不匹配会失败,对吧?好的,如果我们取出[ValidateAntiForgeryToken]属性,该方法是否会在使用Ajax在Web上的另一个站点调用时执行,或者只有在同一个Web中调用时,Ajax调用才能成功?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您删除AntiForgeryToken,它将在任何地方工作。除非您使用委派处理程序或将检查原点的其他安全机制来限制您的应用程序。但是你也可以欺骗它。

我必须找到他们要求AntiForgeryToken的类似问题的解决方案,但我们正在构建纯粹的JavaScript SPA,因此没有ASP.NET MVC(服务器上的Web api和另一个上的SPA)。使其安全工作的唯一方法是引入OAuth2 JWT。 (因为发行者是在JsonWebToken的令牌内签名的,你不能伪造它),那么任何想要打电话给你api的人都必须能够从你那里获得一个令牌。