ValidateAntiForgeryToken 令牌有效但不匹配

ris*_*ism 2 c# security asp.net-mvc

我认为这是相当简单的事情。ValidateAntiForgeryToken是一个过滤器属性,我们可以将其应用于 MVC 控制器上的 post 方法。

它将检查__RequestVerificationToken通过调用@Html.AntiForgeryToken()助手注入的隐藏表单字段的值是否与 Http-Cookie 值匹配。奇怪的是,它似乎有效,但我现在经过审查后不明白如何,因为值不匹配:

在此输入图像描述

使用 Google Dev 工具,我将以下标头发回登录表单。我原以为红色下划线的两个值会匹配,但它们没有匹配,但一切仍然“有效”。那么,ValidateAntiForgeryToken既然我认为在服务器上比较的值实际上并不匹配,那么它是如何工作的呢?

ris*_*ism 5

html 表单字段中的值和通过查看响应标头中的 cookie 公开的值不同,因为它们实际上是包含不同数量属性的序列化有效负载。

因此,虽然 html 表单字段 __RequestVerificationToken 中的某处存在请求令牌的值,但也存在所使用的加密的盐值。

而响应标头中的 Http-Cookie 可能包含该信息以及其他加密数据,例如用户身份数据和角色,这些数据全部捆绑在一起然后序列化。

这就是为什么它们在使用嗅探工具/查看页面源等的客户端上看起来不同的原因。它们是已序列化的不同大小的数据包。所以我们看到的不是令牌,而是包含令牌的序列化对象。

因此,虽然每个请求参数(__RequestVerificationToken 表单字段和 __RequestVerificationToken cookie)都包含彼此完全匹配的内容,但根据我上传的图像,我们看到的每个参数的可见字符串都会有所不同,因为这些字符串不是实际的令牌,而是而是包含标记的对象的序列化输出。

直到整个请求被发送回服务器并且服务器将我们在上图中看到的这些字符串反序列化为对象时,我们才获得一些可以比较匹配的原始属性。