通过Global.asax文件里面的Session_End事件记录用户退出 (or session timeout)

Session.Abandon()和timeout会触发Global.asax的Session_End事件。可以通过这个事件来记录用户退出或者session timeout,这样每个用户都会有一条登陆和退出记录。

退出登陆调用方法:

public void PerformLogout()
{
    HttpContext.Current.Session["PerformLogout"] = true;
    HttpContext.Current.Session.Abandon();
}

Session_End事件代码:  

protected void Session_End(Object sender, EventArgs e)
{
    BusinessContext bizContext = (BusinessContext)Session["BusinessContext"];
    string loginID = string.IsNullOrEmpty(bizContext.LoginID) ? "" : bizContext.LoginID;
    string title = "Timeout";
    if (Convert.ToBoolean(Session["PerformLogout"]))
    {
        title = "Logout";
    }
    BusinessEvent.Log(BizLogCategory.SECURITY, BizLogModule.USER_AUTHENTICATION, title, "[PerformLogout]Logout Successfully", "LoginID: " + loginID, bizContext);
}

有如下几点需要注意:

1. 尽管我们先调用Session.Abandon(),但是在Session_End事件里还是可以继续访问所有session的值。正是因为这个,所以我们可以在PerformLogout方法中给Session["PerformLogout"]赋值,然后通过这个值来判断Session_End事件是由用户登出触发还是由session timeout触发。

2. ASP.NET里面Session和HttpContext.Current.Session对象都指向System.Web.SessionState.HttpSessionState,大部分地方这两个对象可以互换使用,但是在Session_End事件里,HttpContext.Current返回的是null,所以只能通过Session对象来访问session值。为什么要这样写,参考这里

3. 引起session timeout的设置比较多,测试过的有web.config里面的sessionState timeout, IIS Application Pools的Idle Time-out, IIS Application Pools Recycle, Stop website, 修改web.config等。

https://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemodule.end(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon(v=vs.110).aspx
http://forums.asp.net/t/1275683.aspx?Can+t+access+to+Session+variable+inside+Session_End+Event
http://stackoverflow.com/questions/940742/difference-between-session-and-httpcontext-current-session
http://stackoverflow.com/questions/27657773/why-is-httpcontext-current-null-during-the-session-end-event
http://stackoverflow.com/questions/19509672/why-is-httpcontext-current-null
http://stackoverflow.com/questions/12294532/asp-net-values-of-session-variables-in-session-end-event
https://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx
https://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemodule.end.aspx
http://stackoverflow.com/questions/13264212/on-session-timeout-capture-info
http://www.beansoftware.com/ASP.NET-Tutorials/Find-If-Session-Expired.aspx

时间: 2024-10-07 03:18:11

通过Global.asax文件里面的Session_End事件记录用户退出 (or session timeout)的相关文章

在Global.asax文件里实现通用防SQL注入漏洞程序

首先,创建一个SQLInjectionHelper类完成恶意代码的检查 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text.RegularExpressions; /// <summary> ///SQLInjectionHelper 的摘要说明 /// </summary> public class SQLInjec

Global.asax文件—ASP.NET细枝末节(1)

说明 Global的解释是全局的.全球的. Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务. Global.asax使用频率不是特别高,属于细枝末节的小知识点.不说了,来我们一起研究一下这个东西吧. 创建和预览 1.添加 同web.config一样,通常情况下Global.asax文件名是固定的.如果您没有非得要改名的理由,不建议您修改. 你改了,系统不懂了.(

ASP.NET MVC中的Global.asax文件

1.global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 .NET Framework 类,该类是从HttpApplication基类派生的. 因此在global.asax中的代码可以访问HttpApplication类中所有的public或者protected的成员global.asax不被用户直接请求,但global.asax中的代码会被自动执行来

c# .net Global.asax文件的作用

1 Global.asax文件的作用 先看看MSDN的解释,Global.asax 文件(也称为 ASP.NET 应用程序文件)是一个可选的文件,该文件包含响应 ASP.NET 或HTTP模块所引发的应用程序级别和会话级别事件的代码.Global.asax 文件驻留在 ASP.NET 应用程序的根目录中.运行时,分析 Global.asax 并将其编译到一个动态生成的 .NET Framework 类,该类是从HttpApplication基类派生的.配置 ASP.NET,以便自动拒绝对 Glo

Global.asax文件说明

Global.asax是我们的底层文件,第一次的IIS请求都会先去执行它里面的文件,所以学会它里面的函数是非常有必要的.而且我们总是忽略这里的知识点,总觉得这是不必须的,其实我们错了,这里才是程序的根本. 文件代码: /// <summary> /// 所有的应用,状态,程序被访问,用户退出,都可以找到., /// </summary> public class Global : System.Web.HttpApplication { /// <summary> //

ASP.NET中Global.asax 文件是什么

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看一下如何在应用程序开发工作中使用这个文件. 概述 Global.asax 位于应用程序根目录下.虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件.删除它不会出问题——当然是在你没有使用它的情况下..asax 文件扩展名指出它是

Global.asax文件的说明

每个应用程序可以包含一个特殊的目录(/bin)和两个特殊的文件(Web.config和Global.asax) Global.asax文件的使用: 作用:处理应用程序范围内的事件,声明应用程序范围的对象 每个ASP.NET应用程序都支持特定数量的事件,以下是一些最重要的事件: Application_BeginRequest 每个发送服务器的请求引发该事件 Application_End 在应用程序的所有实例结束之前引发 Application_EndRequest 在每个发送服务器的请求结束之

Global.asax 文件是什么

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看一下如何在应用程序开发工作中使用这个文件. 概述 Global.asax 位于应用程序根目录下.虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件.删除它不会出问题——当然是在你没有使用它的情况下..asax 文件扩展名指出它是

.net Global.asax文件使用

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法你可以使用这个文件实现应用程序安全性以及其它一些任务下面让我们详细看一 下如何在应用程序开发工作中使用这个文件概述Global.asax 位于应用程序根目录下虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件删除它不会出问题当然是在你没有使用它的情况下.asax 文件扩展名指出它是一个应用程序文件,