我看过多篇文章,例如this one,解释了如何检测用户的会话已经超时。为清楚起见,这些文章指的是此web.config行定义的超时值:
<sessionState mode="InProc" cookieless="UseDeviceProfile" timeout="120" />
不要过多地使用该方法,但这涉及检查Session.IsNewSession是否为true以及会话cookie是否已存在。但我还没有看到任何关于如何检测身份验证超时的文章 - 这个web.config行定义的那个:
<authentication mode="Forms">
<forms loginUrl="~/Home/Customer" timeout="60" name=".ASPXAUTH" requireSSL="false" slidingExpiration="true" defaultUrl="~/Home/Index" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
</authentication>
在线多篇文章,包括this SO post,都说您的会话超时值通常应该是身份验证超时值的两倍。所以现在,如上所述,我的会话是120,我的身份验证是60.这意味着我永远不会遇到会话超时的情况,但用户仍然是经过身份验证的;如果用户超时,则由于身份验证而非会话。
所以,和其他人一样,我对如何向用户报告他们的会话超时(但实际上是由于身份验证超时)感兴趣。有没有人知道如何实现这一目标,或任何可以指向我解决方案的在线资源?
答案 0 :(得分:1)
这可能不是最佳方法,但这是我想到的。
登录时,在用户登录时记录会话标记中的时间戳。在每个后续请求(可能在global.asax BeginRequest?中)中,将此时间戳与当前时间进行比较,并将其与身份验证超时进行匹配(Scott Hanselman explains how to read it here)。
无论如何,这是我的“头脑”......
答案 1 :(得分:1)
我会在请求的早期利用http管道并发送适当的响应 我回答这些问题的来源是:
Professional ASP.NET 2.0 Security, Membership, and Role Management
HTTP模块可能会起到作用:
<强>的Web.config:强>
<configuration>
<system.web>
<httpModules>
<add name="MyAuthModule" type="MyAssembly.Security.MyAuthModule, MyAssembly"/>
...
实际HTTP模块:
/// <summary>
/// A module for detecting invalid authentication
/// </summary>
/// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
public class MyAuthModule : IHttpModule
{
#region IHttpModule Members
void IHttpModule.Dispose() { }
void IHttpModule.Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
}
#endregion
/// <summary>
/// Inspect the auth request...
/// </summary>
/// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
private void context_AuthenticateRequest(object sender, EventArgs e)
{
HttpApplication a = (HttpApplication)sender;
HttpContext context = a.Context;
// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = context.Request.Cookies[cookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
// check if previously authenticated session is now dead
if (authTicket != null && authTicket.expired)
{
// send them a Response indicating that they've expired.
}
}
}
}
祝你好运!
答案 2 :(得分:1)
当您记录用户时,您可以在用户的计算机上删除一个cookie,表明他们有会话。当用户到达登录页面时(因为如果他们的会话过期,他们的登录也必须有),检查用户是否有该cookie以及他们是否拥有您希望他们拥有的任何会话密钥(如果这证明很难,只需在登录时设置会话变量即可。如果他们有cookie但没有会话密钥,那么他们的会话就会过期。