如何在 asp.net 中设置会话超时和会话空闲超时
How to set session timeout and session idle timeout in asp.net
我有一个简单的问题,但找不到解决方案。我已将 web.config 中应用程序的会话超时设置为:
<sessionState timeout="30" mode="InProc"/>
它工作正常,但现在我得到的要求是,如果用户空闲,也就是说,他在一分钟内没有在页面上执行任何操作,他的会话应该过期。我尝试使用表单身份验证来做到这一点:
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" timeout="1" slidingExpiration ="false" defaultUrl="login.aspx"/>
</authentication>
但它现在可以工作了。任何帮助将不胜感激。
如果我正确理解了这个问题(请参阅 OP 的评论),那么问题是 OP 希望 slidingExpiration
和 absoluteExpiration
都处于活动状态,但有单独的超时。
这将使系统要求用户在闲置一段时间后重新登录,并要求用户在 不同的 时间后重新登录,即使用户没有闲着。
不幸的是,使用 forms authentication
不支持开箱即用。您必须选择滑动或绝对到期。或者您必须自己构建解决方法。
您可以使用一个非常简单的解决方法:
设置 session
的超时时间长于相应的表单身份验证超时时间,也长于所需的绝对超时时间:
<sessionState timeout="35" mode="InProc"/>
设置要使用的表单身份验证slidingExpiration = true
每当用户登录时在会话中创建一个用户登录时间戳:
Session["userLoggedInAt"] = DateTime.UtcNow;
添加一个Application_PostAcquireRequestState
方法到Global.asax
:
void Application_PostAcquireRequestState(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
if (context.Session != null && context.User.Identity.IsAuthenticated)
{
bool forceLogout = false;
if (context.Session["userLoggedInAt"] == null)
forceLogout = true;
else if (!(context.Session["userLoggedInAt"] is DateTime))
forceLogout = true;
else if (DateTime.UtcNow > ((DateTime)context.Session["userLoggedInAt"]).AddMinutes(30))
forceLogout = true;
if (forceLogout)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
}
}
免责声明:上面的代码是快速组合在一起的,可能不是万无一失的...
备注:
- 将滑动到期设置为 1 分钟后超时似乎过于偏执。即使是 fast 用户也无法在此期间完成应用程序中的任何重要工作。甚至我的网上银行也有比那个更长的空闲超时。我建议至少 5-10 分钟。
- Forms 身份验证中的滑动到期有一个 有趣的 功能:滑动通过更新身份验证 cookie 发生,当用户处于活动状态时将到期日期向前移动。但这只会在至少 一半 到期时间过去时发生。如果要保证用户可以闲置10分钟不登出,则必须将超时设置为20分钟。
我有一个简单的问题,但找不到解决方案。我已将 web.config 中应用程序的会话超时设置为:
<sessionState timeout="30" mode="InProc"/>
它工作正常,但现在我得到的要求是,如果用户空闲,也就是说,他在一分钟内没有在页面上执行任何操作,他的会话应该过期。我尝试使用表单身份验证来做到这一点:
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" timeout="1" slidingExpiration ="false" defaultUrl="login.aspx"/>
</authentication>
但它现在可以工作了。任何帮助将不胜感激。
如果我正确理解了这个问题(请参阅 OP 的评论),那么问题是 OP 希望 slidingExpiration
和 absoluteExpiration
都处于活动状态,但有单独的超时。
这将使系统要求用户在闲置一段时间后重新登录,并要求用户在 不同的 时间后重新登录,即使用户没有闲着。
不幸的是,使用 forms authentication
不支持开箱即用。您必须选择滑动或绝对到期。或者您必须自己构建解决方法。
您可以使用一个非常简单的解决方法:
设置
session
的超时时间长于相应的表单身份验证超时时间,也长于所需的绝对超时时间:<sessionState timeout="35" mode="InProc"/>
设置要使用的表单身份验证
slidingExpiration = true
每当用户登录时在会话中创建一个用户登录时间戳:
Session["userLoggedInAt"] = DateTime.UtcNow;
添加一个
Application_PostAcquireRequestState
方法到Global.asax
:void Application_PostAcquireRequestState(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; if (context.Session != null && context.User.Identity.IsAuthenticated) { bool forceLogout = false; if (context.Session["userLoggedInAt"] == null) forceLogout = true; else if (!(context.Session["userLoggedInAt"] is DateTime)) forceLogout = true; else if (DateTime.UtcNow > ((DateTime)context.Session["userLoggedInAt"]).AddMinutes(30)) forceLogout = true; if (forceLogout) { FormsAuthentication.SignOut(); FormsAuthentication.RedirectToLoginPage(); } } }
免责声明:上面的代码是快速组合在一起的,可能不是万无一失的...
备注:
- 将滑动到期设置为 1 分钟后超时似乎过于偏执。即使是 fast 用户也无法在此期间完成应用程序中的任何重要工作。甚至我的网上银行也有比那个更长的空闲超时。我建议至少 5-10 分钟。
- Forms 身份验证中的滑动到期有一个 有趣的 功能:滑动通过更新身份验证 cookie 发生,当用户处于活动状态时将到期日期向前移动。但这只会在至少 一半 到期时间过去时发生。如果要保证用户可以闲置10分钟不登出,则必须将超时设置为20分钟。