【发布时间】:2011-01-21 22:45:28
【问题描述】:
我正在构建的页面很大程度上依赖于 AJAX。基本上,只有一个“页面”,每个数据传输都通过 AJAX 处理。由于浏览器端过度乐观的缓存会导致奇怪的问题(数据未重新加载),我必须使用 POST 执行所有请求(也读取) - 这会强制重新加载。
现在我想阻止页面针对 CSRF。通过表单提交,使用Html.AntiForgeryToken() 可以很好地工作,但是在 AJAX 请求中,我想我必须手动附加令牌?有什么开箱即用的东西吗?
我目前的尝试是这样的:
我很想重用现有的魔法。但是,HtmlHelper.GetAntiForgeryTokenAndSetCookie 是私有的,我不想在 MVC 中乱搞。另一种选择是编写一个扩展,如
public static string PlainAntiForgeryToken(this HtmlHelper helper)
{
// extract the actual field value from the hidden input
return helper.AntiForgeryToken().DoSomeHackyStringActions();
}
这有点 hacky 并留下更大的问题未解决:如何验证该令牌?默认验证实现是内部的,并且针对使用表单字段进行了硬编码。我试着写了一个稍微修改过的ValidateAntiForgeryTokenAttribute,但它使用了一个私有的AntiForgeryDataSerializer,我也真的不想复制它。
在这一点上,提出一个本土解决方案似乎更容易,但这确实是重复代码。
任何建议如何以聪明的方式做到这一点?我是否遗漏了一些非常明显的东西?
【问题讨论】:
标签: asp.net ajax security asp.net-mvc-2 csrf