2013-01-11 50 views
1

我有以下情形:如何處理這兩個登錄用戶和匿名用戶的動作

  • 我有一個ASP.NET MVC的網站/ web應用程序,幾乎所有的控制器由[AuthorizeAttribute]
  • 我有保護引入了新的頁面(一個新的控制器+對它的一些操作),這對登錄用戶和兩個匿名用戶(我稱之爲'public' urls)都可用。對於匿名用戶,我們也使用Session來存儲關鍵數據(例如,通過某些ID識別匿名用戶等)。這些'public'的LayoutView設置的操作是否設置當前用戶是否已通過身份驗證(登錄)。如果他們被認證,則整個childView(由'公開'動作顯示)被嵌入到主佈局頁面中,該頁面顯示登錄用戶的菜單等。匿名用戶沒有菜單,僅僅是純粹的childview頁面。

我的問題:

  • 如果在用戶超時記錄,並試圖訪問上述公共 -urls,那麼頁面會處理他作爲一個notloggedin用戶(這樣的匿名用戶),所以在她訪問新的url之前,她會看到登錄界面,點擊之後,她會看到一個匿名界面,這可能會嚇到她!我無法將她重定向到/ Account/Logon/RedirectUrI = whatever,因爲她訪問的網址對於未登錄的用戶也是有效的。

我能想到的唯一的解決辦法是引入該調用相同BLL邏輯,當前的,但對他們[AuthorizedAttribute]另一個控制器/行動。但是,這我想避免的,因爲:

  • 它的代碼重複的一點點
  • 公共頁面的URL將是不同的登錄的用戶以及匿名用戶,以及我想讓它們保持不變,因此登錄的用戶可以隨意複製粘貼這些網址,傳播這個詞,並且該網址仍然能夠處理匿名用戶。

回答

2

當您想保留一個Url時,您必須爲匿名和經過身份驗證的用戶使用相同的控制器/操作。

您的問題是,當會話超時時,您的身份驗證用戶轉向匿名用戶並生成新的(匿名)會話。

如何區分真正的匿名用戶和有時經過身份驗證但現在匿名的用戶,您可以向所有曾在應用中登錄過的用戶發送特殊的Cookie。

當這樣的身份驗證的用戶會話超時時,瀏覽器會將cookie發送到您的服務器,您可以將其重定向到登錄頁面。

真正的匿名用戶瀏覽器不會發送該cookie,因此您可以只顯示該頁面。

+0

好主意,Jan,我現在檢查一下。一個問題:我會將這個cookie的到期日期設置爲「從不」。 – Csabi

+0

這取決於您的用戶多久返回並訪問您的網站。當用戶通常幾乎每天都訪問您的網站時,將截止日期設置爲凌晨左右就足夠了。 – Jan

相關問題