2011-07-18 36 views
1

我們有一個MVC應用程序,它使用控制器用於AJAX端點,並使用FormsAuth進行身份驗證。GET與POST Ajax請求中的不同行爲

我遇到了一個有趣的場景,其中GET請求的行爲與POST請求不同(對於未經授權的用戶)。

在這種特殊情況下,我們的自定義的ControllerFactory運行下面的代碼試圖訪問該控制器:

FormsAuthentication.SignOut(); 
requestContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl); 
throw new UnauthorizedAccessException(); 

(我認識到,一個AJAX請求重定向裏面是沒有意義的,但包涵)。

當我對此控制器發出GET請求(AJAX)時,客戶端會收到401-未授權異常,我可以在客戶端捕獲並將用戶重定向到登錄頁面。

當我向這個控制器發送一個POST請求(AJAX)時,我得到一個302,並且我的請求被重定向到了我的登錄頁面。

爲什麼GET和POST請求的行爲不同?

+2

你的控制器工廠試圖運行的代碼不是它的責任=>控制器工廠應該實例化控制器,而不是執行認證。你有'[Authorize]'屬性用於這個目的。 –

+0

@Darin - 我意識到這一點,其實就在這個代碼之上的是一個評論,說這是一個黑客攻擊。 :D這個事實源於這樣的事實:如果用戶沒有登錄(由於我們的Io​​C容器是如何設置的),所以一些控制器不能被構造。然而,再一次,與這個問題沒有密切關係。 :D – Jonas

+0

我只是提到了這裏的最佳實踐。事實上,你沒有遵循這些做法,遇到問題並不令我感到驚訝。所有人都這樣做:-)所以,擺脫黑客行爲,以正確的方式做事,並開心。如果你不確定你提供了一個完整的例子來重現你的問題。您在問題中發佈的3行代碼遠遠不夠。 –

回答

1

所以我採取達林的建議,做了一些重構,我不再遇到這個問題。 :)我發現了我的問題的根源,那就是我們有一個MVC錯誤處理的屬性,它沒有IExceptionFilter屬性,所以有些東西是以非確定順序發生的。感謝您在屁股上的有用的踢球。 ;)