2010-10-06 40 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