我正在使用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);
}
}
答案 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"/>
为会话超时添加五或十分钟可提供良好的缓冲区。