MVC反伪造令牌如何在Web服务器重启之间存活?

Dus*_*inA 8 asp.net-mvc csrf antiforgerytoken asp.net-mvc-5

我已经使用MVC 5中的ValidateAntiForgeryTokenAttribute实现了防伪保护.它工作正常,但在未来我们可能会转向更多的"网络农场"托管方法.如果我在开发中运行我的应用程序并转到表单,重新启动Web服务器(通过在Visual Studio中重新启动应用程序)然后提交表单,它不会抛出System.Web.Mvc.HttpAntiForgeryException.

我们的应用程序不使用任何其他会话状态.有人可以帮我理解我的服务器如何从中断的地方开始?我没有在web.config或我能找到的任何其他地方定义machineKey.它与在开发环境中运行有关吗?

我能找到的唯一引用是针对早期版本的MVC,所以我想知道现在是否以不同的方式解决了这个问题.

我很高兴这个功能有效,但我需要理解为什么.

Row*_*man 3

服务器本身不记得任何事情;没必要。

这里起作用的两件事是:

  • 表单隐藏输入
  • 一块饼干

这意味着,如果用户访问带有 的页面AntiForgeryToken,则服务器重新启动,这没有问题,因为用户和表单__RequestVerificationToken仍然与原来相同。

实际的安全令牌是存储在对象内的散列密钥AntiForgeryToken。该对象被序列化为Base 64,这就是您在查看__RequestVerificationToken. 由于每次都会存储安全密钥,因此即使服务器重置,这些值仍然位于这些对象内。然后检索并比较密钥以验证令牌。

在此过程中没有解密。令牌被反序列化,安全密钥被读取然后进行比较。由于安全密钥没有加密,而是经过散列处理,因此无法解密;只是比较。