如果我在单个页面中添加多个表单,是否需要在每个表单中添加单独的防伪令牌?
如果答案是肯定的,那么 ASP.NET MVC 如何找出哪个令牌链接到哪个表单以及如何验证它?
我已经看到它为每个表单创建两个单独的令牌。
If the answer is yes then how would ASP.NET MVC find out that which token was linked to which form and how to validate it?
I've seen it is creating two separate tokens for each form.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在这种情况下,您无需执行任何具体操作。 ASP.NET MVC 将简单地为所有表单重用相同的值,因此它不需要知道哪个表单发送了请求来验证它。只需在每个表单中放置一个
Html.AntiForgeryToken()
并用[ValidateAntiForgeryToken]
属性,你应该没问题。There is nothing specific that you need to do in this case. ASP.NET MVC will simply reuse the same value for all forms so it doesn't need to know which form sent the request in order to validate it. Simply put an
Html.AntiForgeryToken()
in each form and decorate each controller action you are posting to with the[ValidateAntiForgeryToken]
attribute and you should be OK.这里有一篇很棒的文章
我指出了一些重要的部分。
简而言之,
如果可以从请求的 cookie 集合中反序列化令牌,它将重用该令牌而不是生成新令牌。如果 cookie 集合中不存在令牌,它将实例化一个新的“AntiForgeryToken”实例,并随机生成一个新的 16 字节数组来表示该令牌。
生成第一个令牌并将其保存到 cookie 集合后,对辅助方法“Html.AntiForgeryToken()”的所有后续调用都将遵循相同的步骤,并重用 cookie 集合中的现有令牌,而不是产生新的价值。
由于它是会话 cookie,这意味着防伪令牌的值在浏览器会话期间仅生成一次,并在所有后续调用中重复使用。
那么为什么隐藏字段值与如果他们重复使用相同的令牌,则彼此会发生冲突?
因此,虽然加密的值可能看起来不同,但解密的值是相同的。
比较所有三个字节数组表明它们是相同的。
There is a great article here
I pointed out some important sections.
In a nutshell,
If a token can be deserialized from the request’s cookie collection, it’ll reuse that token instead of generating a new one. If a token doesn’t exist in the cookie collection, it’ll instantiate a new instance of “AntiForgeryToken” and randomly generate a new 16 byte array to represent the token.
After generating the first token and saving it to the cookie collection, all subsequent calls to the helper method “Html.AntiForgeryToken()” will follow the same steps and reuse the existing token from the cookie collection instead of generating a new value.
Since it is a session cookie, this means the anti-forgery token’s value is generated only once during a browser session and is reused for all subsequent calls.
So why are the hidden field values different from one another if they are reusing the same token?
So while the encrypted values may look different, the decrypted values are the same.
Comparing all three byte arrays reveals they are identical.