2012-07-03 24 views
8

我正在使用AntiForgeryToken辅助方法。根据我对AntiForgeryToken的了解,它是基于会话的,因此每个用户具有相同的标记,但另一个用户将拥有不同的标记(前提是您对所有表单使用相同的盐)。我的“问题”是AntiForgeryToken正在为相同用户使用相同的盐生成不同的令牌。例如...AntiForgeryToken每个请求的更改

位指示

public ActionResult Test() 
{ 
    return View(); 
} 

查看

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken("Salty!") 
} 

输出请求#1

<input name="__RequestVerificationToken" type="hidden" value="K1sijFuYvyGUJjGg33OnLjJaU3tFpGFDutRt9TOFSkZ6FcrhJMMQPnOqjIHuTwBXs/sPBXEiE+1qyV9l63nnSO161b+OtLbaBoPC7K3/7wxtnuSY+N0o/fqBgVoDyac4dNVp+OvanKBSrHINKfc3WEg9269BHOJNzFowC6Aeac/afAGTGrBypxUHfqrKVowD" /> 

输出请求#2

<input name="__RequestVerificationToken" type="hidden" value="mOpP6LMQXnCmjr5/Wdtnhguh3PyZxWj7GWf8LYzZXPKcJBBT+DbAHvynquSD65O0DBw1RKR7DxCNg372ukftCOWms+o75CraMyFMnvjGk7RU+znIQm05eRQvr5H6d/MDyn+0DWm3jLnMBM9GplsgMRqbdAHzSe69/cS2x9A4X/9jFTZQHUWXXHUr0xewF8Rk" /> 

键是用于与所述相同的盐相同的会话不同。我对CRSF保护有一个根本的误解吗?或者这是一项新功能?

回答

5

反XSRF令牌通过将相同的随机值加密到会话cookie和您的表单中。会话cookie只有在您从生成的表单发表帖子时才会提交。

这种方法也适用例如在所有服务器共享加密密钥的服务器场(在负载均衡场景中)。验证仅通过比较发布的表单数据的解密值和发布的会话cookie的解密值来起作用。这被称为double submitted cookie方法。

所以这是非常正常的,每个请求获得一个不同的值。关于ASP.NET MVC XSRF标记的This is a nice post

+0

所以它改变了服务器上的会话数据发出一个新的令牌时?我的cookies的所有值都保持不变。我认为__RequestVerificationToken_Lw__ cookie值会改变。 –

+0

不,服务器在客户端上设置cookie。客户在发布时会发送相同的值两次。一旦在表单数据中编码并且在cookie中进行一次编码(Cookie在POST上被传送到服务器)。服务器只知道加密密钥。它不存储任何其他用于反XSRF目的的内容。 – m0sa

+0

任何理由不只是在会话中存储令牌,也不会将其发送给客户端?例如:AntiForgery.GetTokens(null,out cookieToken,out formToken); return cookieToken +“:”+ formToken;那么只需将它存储在会话中? –