2011-11-09 48 views
5

我們有一個使用MVC3和自定義身份驗證方法的網站,它根本不依賴表單身份驗證 - 至少從我所知道的。在web.config中,我們設置了AntiForgeryToken沒有表單身份驗證

<authentication mode="None"></authentication> 

並且我們從不在代碼的任何地方使用/設置HttpContext.User。

A required anti-forgery token was not supplied or was invalid 

我們集中在OnAuthorization所有防僞檢查與此代碼:

if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0) 
{ 
    var forgery = new ValidateAntiForgeryTokenAttribute(); 
    forgery.OnAuthorization(filterContext); 
} 

也就是說當使用@ Html.AntiForgeryToken()在某些情況下,用戶獲取此錯誤消息的問題是發生異常的地方。我們有defined a machineKey in web.config以防止應用程序池回收時生成新密鑰。這並沒有解決問題。

接下來我們認爲客戶端的瀏覽器可能不會發送cookie。我們開始記錄cookie,並注意到在某些情況下,RequestVerificationToken_Lw cookie會發送,但在其他情況下不會發送 - 即使其他cookie(如Google Analytics發出的cookie)也可以一起發送。它可能是瀏覽器中的某些東西是剝離出一些cookie並將其他人留下?

看起來好像是anti-forgery token depends on forms authentication。是這樣嗎?在不以可靠的方式使用表單身份驗證的情況下繼續使用AntiForgeryToken的任何方法。請記住,我上面描述的方法適用於90%以上的案例,但我們無法確定爲什麼它不適用於某些人。

想法?
謝謝!

+0

如果您不使用任何身份驗證,爲什麼要關心防僞令牌? CSRF攻擊的目的是攻擊者代表某個網站上的某些經過身份驗證的用戶執行操作。如果一個網站沒有使用認證,CSRF似乎是無意義的。 –

+0

我正在使用身份驗證,而不是表單身份驗證。 – pbz

+0

你使用什麼樣的認證? –

回答

0

一些用戶是否一直有這個問題?或者只是部分時間?此外,它是否一直適用於某些方法,或者對於相同的操作方法是否不一致?你有任何Ajax電話?默認的防僞標記實現不處理AJAX調用。但你可以寫一些自定義代碼來使其工作

+0

我不知道爲什麼顯示爲答案而不是評論 –

+0

感謝您的回覆! 1)有些用戶似乎一直都在使用它,但我能夠與之聯繫的一個用戶有點不技術,因此我無法調查太多。我確實在日誌中看到了他們的IP和錯誤,所以我知道這是合法的。 2)在這些頁面上沒有AJAX調用。我意識到這些限制,我已經在需要的地方開展工作。 – pbz

0

你是否在表單中添加了防僞標記?防僞令牌通過隱藏的HTML元素存儲在客戶端上,因此不作爲cookie。另一個問題是他們使用的瀏覽器版本是什麼?是否可以升級到最新版本?

@using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken()... 
+0

是的,我在表單中包含了令牌。我不知道他們使用的是什麼版本,但他們使用的是Internet Explorer(根據我可以聯繫的一個人)。這發生在其他人身上,但不幸的是我沒有登錄瀏覽器版本。我可能不得不回去儘可能多地登錄以獲取更多數據。我希望以前別人遇到過這個問題。 – pbz