2012-07-03 22 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;那麼只需將它存儲在會話中? –