2011-08-25 69 views
7

我只是通过修改默认的LogOn表单来做一个简单的ASP.NET MVC 3示例的快速测试。根据this article,隐藏字段__RequestVerificationToken和Cookie __RequestVerificationToken_Lw__必须包含与Html.AntiForgeryToken()生成的值相同的值。但是,当我在小提琴中获得它们时,它不完全一样,看着MVC 3源代码,方法GetAntiForgeryTokenAndSetCookie似乎没有使用salt值来生成cookie。 MVC 3有没有变化?为什么AntiForgeryToken的隐藏字段与我的机器上的Cookie不同?

忘了说我仍然可以使用普通或Ajax POST请求成功登录。

这里是原始日志从小提琴:

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 
+1

作为旁注 - AntiForgery令牌旨在用于应用程序的非公开部分(用户已经通过身份验证)。在公共登录表单上使用它们是毫无意义的。 –

+0

LogOn表单仅用于测试目的。 –

回答

2

什么让你觉得他们应该是一样的吗? :)当然,他们必须以某种方式进行比较,但这并不意味着他们的序列化形式必须看起来完全相同。有不同的数据序列化到cookie(我认为只有“盐”和令牌)和HTML标记(盐,标记,创建时间,用户名)。

如果你有兴趣的细节,采取ILSpy并查找System.Web.Mvc.AntiForgeryDataSerializerSystem.Web.Mvc.AntiForgeryDataSystem.Web.Mvc.ValidateAntiForgeryTokenAttribute

+0

谢谢,提到的文章说他们是一样的:),他们的名字也一样。 –

+0

不需要ILSpy,ASP.NET Mvc是开源的。 http://aspnetwebstack.codeplex.com/SourceControl/latest – haim770

1

你在你的问题所引用的文章OnAuthorization方法是完全错误的,因为隐藏字段防伪造令牌永远不会与防伪cookie值相同。

我的回答增值是link to interesting article,它描述了ASP.NET防伪标记内部。它除其他外,提供了清晰的步骤来解码和解密的Cookie /令牌形式:

BitConverter.ToString(System.Web.Helpers.AntiXsrf.MachineKey45CryptoSystem.Instance.Unprotect(tokenValue)) 

...和随后的步骤,以符合饼干和形式的代币。

相关问题