2016-08-20 79 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沒問題,慢慢來。 –