2010-10-06 21 views
1

我有一個只適用於註銷用戶的<asp:Wizard>。如果用戶當前登錄,他/她將被重定向到另一個頁面。在其中一個嚮導步驟中,作爲嚮導的一部分,我通過<asp:Login>控件要求憑證並登錄該用戶。這提出了一個問題。識別來自ASP.NET登錄控件的回發

According to MSDN:「當用戶使用登錄控件登錄網站時,視圖狀態中的所有數據和所有發佈數據都將丟失。請勿在LoggedIn事件中執行依賴視圖狀態的操作。 「

因此,我的Wizard控件在登錄過程後忘記了它所在的步驟。 「MSDN recommends:」如果將Login控件嵌入到WizardStep對象中,則在用戶通過身份驗證時,請在Page_Load事件處理程序中明確設置ActiveStepIndex屬性。在此情況下,Wizard控件不會自動前進到下一個WizardStep對象。

但是,由於所有視圖狀態都已丟失,因此登錄用戶的重定向會啓動,並將用戶從頁面中移出。在頁面加載時,確定用戶處於哪種狀態的最佳方式是什麼?

  • 已經在某段時間之前登錄;需要重定向。
  • 剛剛從嚮導中登錄;需要進入下一個嚮導步驟。

感謝您的任何想法。

回答

1

「一場奇怪的比賽,唯一獲勝的舉動是不玩。 「參考War Games

而不是玩防止重定向遊戲,不同的解決方案是可能的。由於我控制所有有關頁面的鏈接,因此當用戶登錄時,我可以將這些鏈接的目標(href)更改爲重定向頁面。這繞過了在頁面本身上「播放」的需要,並且允許該頁面(如果被登錄用戶命中)總是跳轉到適當的下一個嚮導步驟。

1

你可以設置一個會話變量時,在用戶登錄:Session("LoggedIn") = Now

當檢查對用戶重定向,檢查的loggedIn是至少3分鐘前,然後重定向。 因爲您在登錄後設置此Session變量,它將可用(或者如果未登錄,可能爲空)。

您可能希望創建一個自定義登錄控制,從登錄繼承,設置此會話變量,每當用戶登錄:

Public Class MyLogin : Inherits Login 
    Private Sub MyLogin_LoggedIn() Handles Me.LoggedIn 
     HttpContext.Current.Session("LoggedIn") = Now 
    End Sub 
End Class 
+0

檢查時間以來登錄似乎是明顯的路線,但它並不十分安全,所以我更喜歡另一種解決方案。用戶可以登錄,然後立即訪問此頁面,因此該值必須更像3秒(以吸引快速用戶),即使如此,緩慢加載的頁面也可能會錯過窗口,導致不必要的重定向。 – ChessWhiz 2010-10-07 16:55:06

+0

然後將事件添加到允許的登錄控件中,並且只允許該登錄設置會話對象以防止重定向 – Willem 2010-10-07 17:11:01

+0

這可行,但比我發佈的解決方案稍複雜。不過謝謝你的想法! – ChessWhiz 2010-10-07 18:39:06