我刚刚通过修改默认的LogOn表单对一个简单的ASP.NET MVC 3示例进行了快速测试。根据{{3}},隐藏字段__RequestVerificationToken
和Cookie __RequestVerificationToken_Lw__
必须包含Html.AntiForgeryToken()
生成的相同值。但是当我在Fiddle中获取它们时,它并不完全相同,顺便说一句,看看MVC 3源代码,方法GetAntiForgeryTokenAndSetCookie
似乎没有使用salt值来生成cookie。 MVC 3有没有变化?
忘了说我仍然可以使用普通或Ajax POST请求成功登录。
这是来自Fiddle的原始日志:
POST http://localhost:51713/Account/LogOn HTTP/1.1
Referer: http://localhost:51713/Account/LogOn
Content-Length: 256
Origin: http://localhost:51713
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded
Cookie: __RequestVerificationToken_Lw__=OIRtVqUvNt/LfDGeoVy3W1VhdKN7MwdbUZmRNScz4NqS4uV0I0vQH2MHg77SsVhcinK5SJi9mVcdBUWk2VMiPTk8EMUN2Zq0X4ucK8XQ3/zr6NoiIvVF73Bq8ahbFaY/IrNrWY7mmzvO9j/XVLNN2lNqgCd6I3UGZAw3/nlOmpA=
__RequestVerificationToken=zeDS%2F8MZE%2BLf%2FrRhevwN51J7bOE3GxlGNLQc8HogwFctF7glU1JboHePTTHa5YFe9%2FD2sY7w167q53gqvcwYZG1iZeecdnO4fdg6URdR4RUR%2BjIgk1apkXoxQ2xg48REfv4N5D4SHKU4MAf30Diy0MVyyF9N2Dl7uUGT6LbKHZU%3D&UserName=Tien&Password=tien&RememberMe=false
答案 0 :(得分:5)
是什么让你认为他们应该是一样的? :)当然,他们必须在某种程度上具有可比性,但这并不意味着他们必须在序列化形式中看起来相同。有一组不同的数据序列化为cookie(我认为只有“盐”和令牌)和HTML标记(盐,令牌,创建时间,用户名)。
如果您对详细信息感兴趣,请参阅ILSpy并查找System.Web.Mvc.AntiForgeryDataSerializer
的{{1}},System.Web.Mvc.AntiForgeryData
和OnAuthorization
方法
答案 1 :(得分:2)
您在问题中引用的文章是完全错误的,因为隐藏字段防伪标记永远不会与防伪cookie值相同。
我的答案的附加值是link to interesting article,它描述了ASP.NET防伪令牌内部。除其他外,它提供了解码和解密cookie /表单令牌的明确步骤:
BitConverter.ToString(System.Web.Helpers.AntiXsrf.MachineKey45CryptoSystem.Instance.Unprotect(tokenValue))
...以及后续步骤以匹配Cookie和表单令牌。