2011-05-20 22 views
0

我想知道如何解決我遇到授權屬性沒有在我的項目,有時工作時間

我做我的代碼登錄與FormsAuthentication.SetAuthCookie(user.Login, false); 我的控制器中的每一個方法的行爲的[授權]屬性

web.config

<authentication mode="Forms"> 
    <forms loginUrl="~/Login/Index" timeout="10"/> 
</authentication> 

的問題是有時我不去到登錄頁面和Authorize屬性過得那麼我的控制器方法崩潰(是導致沒有會話數據)。爲了修復它,我清除了瀏覽器緩存,並在其工作後才重新啓動瀏覽器。

我認爲我的登錄邏輯有一些麻煩?有人可以解釋它,以及如何以正確的方式做到這一點。

回答

2

表單身份驗證和ASP.NET MVC授權過濾器都不具有ASP.NET會話狀態的任何依賴關係。所以如果控制器方法因缺少會話數據而崩潰,那麼它與你的代碼有關,它假定了這種關係。請參閱this article以瞭解Authorize如何與ASP.NET身份驗證配合使用。

我相信你的問題起源於你正在假設表單認證與會話狀態同義。但是你可以在沒有認證的情況下擁有會話狀態兩者使用不同的機制,並有不同的超時時間。因此,如果您在登錄頁面中以會話狀態提供一些數據,那麼您的會話可能會過期,但身份驗證仍然有效(因此,您將不會被帶到登錄頁面)。一個簡單的解決方案可以將會話和身份驗證超時同步,但這不適用於重新啓動應用程序。最好的方法是檢查相關的會話數據,如果它不存在,則強制重新登錄或使用經過身份驗證的用戶的主體/身份信息來恢復會話中的數據。我更喜歡後面的方法。

+0

感謝您的回覆,所以如果我創建自己的自定義授權屬性,並將檢查會話可以幫助應用程序重新啓動? – 2011-05-20 09:25:56

+0

@Sanja,是的,你可以編寫自己的自定義過濾器來檢查會話。或者你可以在諸如Application_AcquireRequestState之類的事件中在global.asax中編寫這樣的代碼。 – VinayC 2011-05-20 09:56:08