单个Razor视图包含多个表单,每个表单都有自己对@ Html.AntiForgeryToken()的调用
<form id="f1"> @Html.AntiForgeryToken() </form> <form id="f2"> @Html.AntiForgeryToken() </form>
据我了解,这两种防伪标记应该是相同的.
<form id="f1"> <input name="__RequestVerificationToken" type="hidden" value="duVT4VtiYybun-61lnSY1ol__qBwawnELooyqT5OSrCJrvcHvDs_Nr9GLxNxwvBaI4hUcKZVkm6mDEmH2UqNorHD1FnJbKJQLWe8Su_dhy_nnGGl5GhqqC3yRGzcxbBM0" /> </form> <form id="f2"> <input name="__RequestVerificationToken" type="hidden" value="ZMISz3IWHU_HCKP4FppDQ5lvzoYhlQGhN1cmzKBPz4OgDzyqSUK3Q1dqvw1uHsb4eNyd9U3AbFcnW8tR7g1QS8Dyhp0tFc-ee1sfDAOqbLCcgd3PDnLCbXx09pnPREaq0" /> </form>
为什么价值不同?
当然它们应该是相同的,因为它们是从服务器发送的相同响应中的?
documentation没有说只召唤一次.
解决方法
Anti-Forgery令牌不会直接进行比较 – 服务器必须先取消保护它并比较内部的受保护数据.拥有不同的受保护令牌并不一定意味着它们包含不同的数据.
System.Web.Helpers.AntiXsrf.TokenValidator比较的是解密的AntiForgeryToken实例中的SecurityToken.但是,这些实例还包含AdditionalData字段,UserName字段和ClaimUid字段.
此外,AntiForgeryToken中的SecurityToken直接从AntiForgeryWorker中的(当前有效,否则是新生成的)AntiForgery cookie中复制.
鉴于所有数据都是序列化,加密然后编码,由于令牌之间的AdditionalData之间存在差异,因此受保护令牌可能存在差异,或者可能是由于加密过程中使用的伪随机数(由于我可能使用)可以测试2个完全不同的令牌对同一个cookie有效).