我们正在使用.NET Framework 4.5和基于声明的身份验证/授权开发ASP.NET MVC Web应用程序。该应用程序使用标准的ASP.NET机制将令牌保存到cookie中,以读取先前已缓存到内存中的POST之间的声明。
我们在web.config文件中配置了会话超时,如下所示:
<sessionState timeout="1" mode="InProc"/>
发生会话超时时,会调用Session_End事件处理程序:
protected void Session_End(object sender, EventArgs e)
{
Session.RemoveAll();
FederatedAuthentication.SessionAuthenticationModule.SignOut();
}
执行Session_End后,会触发Session_Start处理程序:
protected void Session_Start(object sender, EventArgs e)
{
Breadcrumb breadcrumb = new Breadcrumb();
Session["Breadcrumb"] = breadcrumb;
}
此行为导致自定义筛选器检查是否存在会话,以便始终返回true:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Get context
HttpContext ctx = HttpContext.Current;
// If the browser session has expired...
if (ctx.Session != null && ctx.Session["Breadcrumb"] == null)
{
// Redirect to login page
}
}
}
另一方面,如果用户单击“注销”菜单选项,则会调用以下处理程序:
public ActionResult Logout()
{
FederatedAuthentication.SessionAuthenticationModule.SignOut();
return RedirectToAction("Login", "Account");
}
在此之后,如果我们在浏览器中输入有效的应用程序URL,则会显示该页面而不会提示输入凭据。这是否意味着令牌仍然有效?
你能告诉我们发生了什么吗?
非常感谢您的帮助。