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

Kya*_*ein 7 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);                                           

            }
        }
Run Code Online (Sandbox Code Playgroud)

Paw*_*iak 20

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

<authentication mode="Forms">
    <forms defaultUrl="~/Default.aspx"
        loginUrl="~/Login.aspx"
        slidingExpiration="true"
        timeout="60" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

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


Kev*_*Kev 13

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

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

<sessionState 
    mode="InProc" 
    cookieless="false" 
    timeout="70"/>
Run Code Online (Sandbox Code Playgroud)

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