使用 SQL Server 的CONTEXT_INFO进行经典 ASP 登录跟踪



我正在将一个经典的ASP站点迁移到ASP。净MVC。作为迁移的一部分,我们已经将数据库从MS Access迁移到SQL Server,并且已经在SQL端设置了基本的触发级审计日志。

我想做的是跟踪当前登录的用户的经典ASP网站的触发级审计的目的。

对于MVC结束的事情,我使用SQL的SET CONTEXT_INFO (ref)与实体框架和"每个请求一个数据上下文"规则,这允许我将上下文信息设置为当前登录的MVC用户的ID。一切都好。

我想以相同的经典ASP网站,但不确定如何。是否有一种方法可以捕获"每个请求"来设置CONTEXT_INFO,例如我们可以在MVC中?我对经典ASP管道的工作方式不够熟悉,无法知道这是否可以做到,或者数据库连接(在包含文件和ADODB连接中实现为连接字符串)是否将在应用程序池中持久化,这意味着我没有办法做到这一点。有人知道这是可能的吗?

以下是一些事实。

  • CONTEXT_INFO存储在会话/批处理范围内,而不是连接。

From Using Session Context Information

会话上下文信息使应用程序能够设置二进制值最多128字节,可以在多个批次中引用,存储操作的过程、触发器或用户定义函数会话 .

  • 当您从池中获取连接时,ADO(使用体面的,最好是官方数据提供程序,如SQLOLEDB, SQLNCLI)执行sp_reset_connection,这表明连接正在被重用。

  • 从SQL Server 2005 *开始,sp_reset_connection重置CONTEXT_INFO

From System Stored Procedures (Transact-SQL)

sp_reset_connection存储过程被SQL Server用来在事务中支持远程存储过程调用。这个存储过程还会导致审计登录和审计注销事件触发

总之,在一个开放的会话中使用CONTEXT_INFO是安全的。

因此,只要在请求期间坚持使用相同的连接对象引用(adoCon),以下代码就符合one data context per request规则。

<%
Dim adoCon ' global scope variable
Set adoCon = Server.CreateObject("ADODB.Connection")
adoCon.ConnectionString = "Provider=SQLNCLI10;Data Source=..."
adoCon.Open 'connection taken from the pool, a session "possibly recycled" started
'CONTEXT_INFO() is definitely NULL right now
adoCon.Execute "SET CONTEXT_INFO 0x01"
'all database operations through the adoCon ...
adoCon.Close 'connection closed, session released
%>

相关内容

  • 没有找到相关文章

最新更新