如何在Session过期时重定向到LogIn页面(ASP.NET 3.5 FormsAuthen)

时间:2009-03-17 12:27:59

标签: asp.net

我正在使用FormsAuthentication和ASP.Net SqlMembership Provider。我希望在基础会话到期时提供重定向到LogIn页面的功能。

我将以下代码块放在 BasePage OnInit 中。据我测试,它始终保持重定向到LogIn页面,即使我提供了正确的UserID和密码。通过权利,它应该带我到默认页面。

if (Context.Session != null && Session.IsNewSession && this.Request.IsAuthenticated)
        {
            string cookieHeader = Request.Headers["Cookie"];
            if (cookieHeader != null && cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)
            {


                    HttpContext.Current.Session.Abandon();                       
                    FormsAuthentication.SignOut();                        
                    Response.Redirect(FormsAuthentication.LoginUrl);                                           

            }
        }

2 个答案:

答案 0 :(得分:20)

您不需要此功能的任何自定义代码,它受Framework支持。只需在web.config中配置它:

<authentication mode="Forms">
    <forms defaultUrl="~/Default.aspx"
        loginUrl="~/Login.aspx"
        slidingExpiration="true"
        timeout="60" />
</authentication>

通过上述配置,用户将在会话到期时始终重定向到Login.aspx页面。超时为60分钟,滑动到期意味着每次用户向Web应用程序发出请求时都会延长超时,因此如果他保持活动状态,则会话将不会过期。像这样的配置比你试图做的更具优势 - 一旦用户登录,他将自动重定向回他最初请求的资源。并且您始终可以覆盖和自定义此行为。

答案 1 :(得分:13)

Pawel's answer部分正确,但您还需要将Session生命周期设置为比表单身份验证Cookie生存期更长的值。表单身份验证timeout值仅影响身份验证cookie的生命周期。在他提供的示例中,身份验证cookie生存期为60分钟,但默认会话生存期为20分钟。如果用户离开他们的计算机超过20分钟,他们的会话数据将被丢弃,后续尝试引用存储在会话中的值将导致抛出异常(例如System.NullReferenceException如果尝试.ToString()或演员)。

您可以通过配置web.config文件中的sessionState设置在应用程序中全局设置:

<sessionState 
    mode="InProc" 
    cookieless="false" 
    timeout="70"/>

为会话超时添加五或十分钟可提供良好的缓冲区。