2014-07-23 54 views
8

我已經使用MVC 5中的ValidateAntiForgeryTokenAttribute實現了防僞保護。它工作正常,但將來我們可能會轉向更多的「網絡農場」方法來託管。如果我在開發中運行應用程序並轉到表單,請重新啓動Web服務器(通過在Visual Studio中重新啓動應用程序),然後提交表單,但不會拋出System.Web.Mvc.HttpAntiForgeryException。在Web服務器重新啓動之間,MVC反僞造令牌如何生存?

我們的應用程序不使用任何其他會話狀態。有人可以幫助我理解我的服務器如何從停止的位置獲取?我沒有在我的web.config或我能找到的其他地方定義machineKey。它與在開發環境中運行有關嗎?

我唯一可以找到的參考是早期版本的MVC,所以我想知道現在是否以不同的方式解決了這個問題。

我很高興這個功能有效,但我需要理解爲什麼。

回答

2

服務器本身不記得任何東西;它不必。

在這裏工作的兩兩件事是:

  • 的形式隱藏輸入
  • 一個cookie

這意味着,如果用戶訪問一個網頁,上面有一個AntiForgeryToken,那麼服務器重新啓動,這是沒有問題的,因爲用戶和表單的__RequestVerificationToken仍然是一樣的。

實際安全令牌是存儲在AntiForgeryToken對象內的散列密鑰。該對象被序列化爲Base 64,這就是您在查看__RequestVerificationToken的值時看到的內容。由於安全密鑰每次都存儲,即使服務器重置值仍在這些對象內。然後檢索並比較密鑰以驗證令牌。

在這個過程中沒有解密。令牌被反序列化,安全密鑰被讀取並進行比較。由於安全密鑰是未加密,而是散列,則它們不能被解密;只有比較。

+0

謝謝你。我知道這兩個值是比較的,但我認爲用於解密值的加密密鑰應該在重新啓動IIS時重新生成。因爲密鑰是新的,所以它不應該能夠解密值。 – DustinA

+0

啊,我明白你在問什麼了。很好的問題。我會更新我的答案。 –

+0

我很欣賞你寫這個答案的時間,但我不確定這是否正確。這個微軟網站上說「反XSRF令牌的有效載荷是經過加密和簽名的」。以下是該網頁的網址:http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages。我相信我的情況是,用於加密和解密的MachineKey在重新啓動網站或應用程序池之間並不會像以前那樣發生實際變化。我找不到支持這些文檔的文檔,但這正是我認爲正在發生的事情。 – DustinA

相關問題