我正在构建的页面在很大程度上取决于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();
}
Run Code Online (Sandbox Code Playgroud)
这有点hacky并留下未解决的更大问题:如何验证该令牌?默认验证实现是内部的,并且使用表单字段进行硬编码.我尝试写一个稍微修改过ValidateAntiForgeryTokenAttribute,但它使用的AntiForgeryDataSerializer是私有的,我真的不想复制它.
在这一点上,似乎更容易想出一个自己开发的解决方案,但这确实是重复的代码.
有什么建议如何以聪明的方式做到这一点?我错过了一些完全明显的东西吗