我已经使用MVC 5中的ValidateAntiForgeryTokenAttribute实现了防伪保护.它工作正常,但是在未来我们可能会转向更多的“网络农场”托管方法.如果我在开发中运行我的应用程序并转到表单,重新启动Web服务器(通过在Visual Studio中重新启动应用程序)然后提交表单,它不会抛出System.Web.Mvc.HttpAntiForgeryException.
我们的应用程序不使用任何其他会话状态.有人可以帮助我理解我的服务器如何从它停止的地方开始?我没有在我的web.config或我能找到的任何其他地方定义machineKey.它与在开发环境中运行有关吗?
我能找到的唯一引用是针对早期版本的MVC,所以我想知道现在是否以不同的方式解决了这个问题.
我很高兴这个功能有效,但我需要了解原因.
解决方法
服务器本身不记得任何东西;它不必.
这里的两件事是:
>表单隐藏输入
>一个cookie
这意味着如果用户访问其上带有AntiForgeryToken的页面,那么服务器将重新启动,这没有问题,因为用户和表单的__RequestVerificationToken仍然是相同的.
实际的安全令牌是一个存储在AntiForgeryToken对象中的哈希键.此对象序列化为Base 64,这是您在查看__RequestVerificationToken的值时看到的内容.由于每次都存储安全密钥,即使服务器重置,值仍然在这些对象内.然后检索并比较密钥以验证令牌.
在此过程中没有解密.对令牌进行反序列化,读取安全密钥然后进行比较.由于安全密钥未加密,而是加密,因此无法解密;只比较.