Asp.net mvc AntiForgeryToken和ValidateAntiForgeryToken出现意外行为

Asp.net mvc AntiForgeryToken和ValidateAntiForgeryToken出现意外行为,asp.net-mvc,forms,post,csrf,antiforgerytoken,Asp.net Mvc,Forms,Post,Csrf,Antiforgerytoken,我已经开始在一些表单中使用AntiForgeryToken来防止跨站点请求伪造。然而,我有一些奇怪的行为,只是想澄清这是一个错误还是只是我做错了什么。我正在表单中使用Html.AntiForgeryToken()调用。然后在表单发布到的操作方法中使用[ValidateAntiForgeryToken]属性。我现在不用盐 我的理解是,Html.AntiForgeryToken()生成一个名为\uuu RequestVerificationToken的隐藏输入和一个名为\uu RequestVeri

我已经开始在一些表单中使用AntiForgeryToken来防止跨站点请求伪造。然而,我有一些奇怪的行为,只是想澄清这是一个错误还是只是我做错了什么。我正在表单中使用
Html.AntiForgeryToken()
调用。然后在表单发布到的操作方法中使用
[ValidateAntiForgeryToken]
属性。我现在不用盐

我的理解是,
Html.AntiForgeryToken()
生成一个名为
\uuu RequestVerificationToken
的隐藏输入和一个名为
\uu RequestVerificationToken\u Lw\uuu
的cookie,两者都应该包含相同的值

然而,我所经历的行为是:

  • 无论您使用了多少次,cookie始终具有相同的值 获取页面
  • 每次获取页面时,隐藏的输入都有不同的值
  • ValidateAntiForgeryToken每次都进行验证,即使是从 CSRF场景中的不同站点
  • 如果我更改外部站点中隐藏输入的值,则 令牌不验证(预期行为,但为什么验证 当隐藏的输入/cookie值不同时?)

  • 有人有什么想法吗?

    对于第3项,您是否在CSRF场景中包含隐藏字段

    AntiForgeryToken的安全性在于,隐藏的输入仅存在于您的域所服务的页面中,不能被其他域复制或捕获。如果您模拟了一个通过隐藏输入的测试,那么这不是一个有效的测试


    我建议您阅读Phil Haack的这篇文章:

    Ok,刚刚发现哪些状态表示它们的序列化方式不同,因此它们似乎包含不同的值。然而,这并不能解释为什么我的cookie值从未更改(直到我删除它并在重新获取页面时生成一个新的cookie),但输入值确实会更改,或者为什么它总是进行验证。这种行为似乎只在安全请求中发生。当我在CSRF站点中按原样提取代码(带有隐藏表单字段),然后提交表单时,它始终在服务器上进行验证。显然,如果代码不在那里,它就不会像预期的那样进行验证。但仍然不知道为什么cookies值保持不变。