Asp.net mvc 如果我在一个页面中添加多个表单,是否需要在每个表单中添加单独的防伪令牌?

Asp.net mvc 如果我在一个页面中添加多个表单,是否需要在每个表单中添加单独的防伪令牌?,asp.net-mvc,antiforgerytoken,Asp.net Mvc,Antiforgerytoken,如果答案是肯定的,那么ASP.NET MVC如何找出哪个令牌链接到哪个表单以及如何验证它 我已经看到它为每个表单创建了两个单独的标记。在这种情况下,您无需执行任何特定操作。ASP.NET MVC将简单地对所有表单重用相同的值,因此它不需要知道哪个表单发送了请求才能对其进行验证。只需在每个表单中添加一个Html.AntiForgeryToken(),并用该属性修饰您发布到的每个控制器操作,您就可以了。有一篇很棒的文章 我指出了一些重要的部分 简言之, 如果可以从请求的cookie集合反序列化令牌,

如果答案是肯定的,那么ASP.NET MVC如何找出哪个令牌链接到哪个表单以及如何验证它


我已经看到它为每个表单创建了两个单独的标记。

在这种情况下,您无需执行任何特定操作。ASP.NET MVC将简单地对所有表单重用相同的值,因此它不需要知道哪个表单发送了请求才能对其进行验证。只需在每个表单中添加一个
Html.AntiForgeryToken()
,并用该属性修饰您发布到的每个控制器操作,您就可以了。

有一篇很棒的文章 我指出了一些重要的部分

简言之, 如果可以从请求的cookie集合反序列化令牌,它将重用该令牌,而不是生成新的令牌。如果cookie集合中不存在令牌,它将实例化“AntiForgeryToken”的新实例,并随机生成一个新的16字节数组来表示令牌

public AntiForgeryToken GetCookieToken(HttpContextBase httpContext)
{
    HttpCookie cookie = httpContext.Request.Cookies[this._config.CookieName];

    if (cookie == null || string.IsNullOrEmpty(cookie.Value))
        return (AntiForgeryToken) null;

    return this._serializer.Deserialize(cookie.Value);
}
生成第一个令牌并将其保存到cookie集合后,对帮助器方法“Html.AntiForgeryToken()”的所有后续调用都将遵循相同的步骤,重用cookie集合中的现有令牌,而不是生成新值

由于它是一个会话cookie,这意味着在浏览器会话期间仅生成一次防伪令牌的值,并在所有后续调用中重复使用。

那么,如果使用相同的令牌,为什么隐藏字段值彼此不同呢?

因此,虽然加密的值看起来可能不同,但解密的值是相同的

byte[] one = MachineKey45CryptoSystem.Instance.Unprotect("iAdQj5D0qrMuTggD8WpnOZPlVOfHg_qmPIEjnULAYd1h56cV2cL51rcaY8_UgxQbav5_6KTAtyE52ir1X6GmaS9ZPgw1");
byte[] two  = MachineKey45CryptoSystem.Instance.Unprotect("Shvi8Bxe6-a8zfCfDGnxkaC-IETsbjkR9iIylwn-2VRWQ-GtQkdowdFw1biU7dN3j-xPJZHYQPe-hNfWspYjy_ZcCCY1");
byte[] three = MachineKey45CryptoSystem.Instance.Unprotect("ZhaVFngUMLo88jmTIx___BTWlYFyKh1GalwEeffRl0-o3Gu7_m98k6aQjO7IysZIdXxVx6TqL6QIfX19Uwq3Ia6dghA1");

比较所有三个字节数组表明它们是相同的。

是的,当我有一个表单时,我使用AjaxForm插件(它将表单转换为ajax请求),但有时我没有表单;触发post请求的普通链接。为此,我想在母版页中添加一个antiforgerytoken,并将其用于ajax的所有功能。感谢发布的答案不正确“ASP.NET MVC将对所有表单重复使用相同的值,因此不需要知道哪个表单发送了请求才能进行验证。”我在一个页面上有多个表单,并为每个表单调用了Html.AntiForgeryToken(),每个表单都创建了一个唯一的值,我在这方面遇到了问题“提供的防伪令牌用于与当前用户不同的基于索赔的用户。“我确认DJA报告的内容,我处于相同的情况:我有三种表单,它们都有不同的requestverificationtoken,也不同于cookie中的值,,,我的ajax post请求被401未经授权的响应代码拒绝…请给出更深入的解释?我与@DJA和@Souhaiebbes有相同的问题。二同一页面上的表单,每个表单都带有一个
Html.AntiForgeryToken()
,生成两个不同的令牌,然后一个(或两个?)无法处理单个cookie。有人找到解决方案了吗?请再说一遍。有一个解决方案,尽管存在一些安全问题,如下所示: