2016-08-20 108 views
1

我正在将传统的ASP站点迁移到ASP.NET MVC。作为迁移的一部分,我们已经将数据库从MS Access移到了SQL Server,并且已经在SQL的结尾部分设置了基本的触发级别审计日志记录,这是很好的措施。使用SQL Server的CONTEXT_INFO进行传统的ASP登录跟踪

我想要做的就是追踪经典ASP站点的当前登录用户,以进行触发级别审计。

对于事物的MVC结束时,我用SQL的与实体框架和“每个请求一个数据上下文”的规则,这让我设置上下文信息在MVC用户的ID当前登录一起SET CONTEXT_INFOref) 。一切都很好。

我想对经典的ASP网站一样,但我不确定如何。有没有一种方法可以捕获“每个请求”来设置CONTEXT_INFO,比如我们可以在MVC中进行设置?我对Classic ASP管道如何工作以了解是否可以完成,或者如果数据库连接(在包含文件和ADODB连接中作为连接字符串实现)将保持在App Pool中不熟悉,意味着我没有办法做到这一点。有谁知道这是否可能?

+0

依靠应用程序池中的ADODB连接并不是一个好主意。但是,如果这只是为了随意审计追踪,那肯定没有错。 –

+0

@EmacsUser - 遗留的传统ASP应用程序使用ADODB连接,我假设它是在应用程序池中持久化/集中的。我愿意提供关于如何在经典ASP的vbscript中建立连接的其他想法,但我的印象是选项有限。 – jleach

回答

2

以下是一些事实。

  • CONTEXT_INFO保存在会话/批量作用域而不是连接。

Using Session Context Information

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

  • 当你从游泳池,ADO的连接(与像SQLOLEDB体面,优选官方数据提供者,当然SQLNCLI)执行sp_reset_connection其指示连接正在被重复使用。

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

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 
%> 
+0

太棒了!我认为这是一个死胡同的问题。自从问了这个问题之后,我做了一堆探索,并认为我可以这样做,但你的答案对我来说确实很有帮助。下周我会深入研究,给我几天时间来尝试一下,并为您提供一个可以接受的答案。谢谢 – jleach

+0

@ jdl134679没问题,慢慢来。 –