2010-05-25 30 views
2

使用基於觸發器的方法來審計日誌記錄,我正在記錄對數據庫中的表所做更改的歷史記錄。我使用的方法(使用靜態sql服務器登錄)記錄哪個用戶進行了更改,包括在每個數據庫連接開始時運行存儲過程。記錄審計行時,觸發器使用此用戶名。 (觸發器由產品提供OmniAudit)如何在記錄用戶進行更改時審覈ASP.NET成員表?

然而,ASP.NET成員表主要通過會員API訪問。當Membership API打開其數據庫連接時,我需要傳入當前用戶的身份。我嘗試了繼承MembershipProvider,但我無法訪問底層數據庫連接。

看起來這將是一個常見的問題。有誰知道我們可以訪問ASP.NET成員資格進行數據庫連接時可以訪問的任何鉤子嗎?

回答

1

更新2: 不上AOP正面看起來不錯,我很害怕 - 見Is is possible to intercept a static method on an object you don't own and did not create?

而且在評論暗示,它看起來像最好的辦法是使用提供程序工具包的實施供應商和電線的勾成SqlConnectionHelper.GetConnection()

我使用工具包的代碼,我已經清理了相當大,可靠多年,沒有任何問題。如果您有興趣,請在4.0上確認並打包。


更新:

好吧,我想我更好地瞭解您的需求,請告訴我,如果我是正確的:

您需要正在使用由提供實際的連接?

SqlMembershipProvider的利用輔助類,System.Web.DataAccess.SqlConnectionHolder,爲它的所有數據訪問。

我還沒有做到這一點,但從我收集到的信息來看,您可以使用AOP實現(例如Castle DynamicProxy)(或者其中一個利用它的庫)來攔截調用來構建此對象,並在那裏獲得連接。

可能有人有更多經驗的證實或否認這一點?


原來的答覆:

無需從SqlMembershipProvider的派生。只需進入並得到你需要的東西。

string connectionString = 
    typeof(SqlMembershipProvider) 
    .GetField("_sqlConnectionString",BindingFlags.NonPublic | BindingFlags.Instance) 
    .GetValue(Membership.Provider); 
+0

謝謝,非常有趣的想法。我在想,AOP方法是有意義的。不知道我現在想引入另一個依賴於像Castle這樣的東西。現在我正在考慮使用我剛發現的SqlMembershipProvider的源代碼。我擔心的一個問題是,這個源代碼是從2006年開始的,我不知道它是否被後續的asp.net版本更新過。 – Pete 2010-05-26 14:25:11

+0

其實,我還有一個關於AOP的問題,它對我們來說並不好看.http://stackoverflow.com/questions/2912300/is-is-possible-to-intercept-a-constructor-on-a-但是 - 我的下一個建議是使用基於工具包示例的自定義提供程序。多年來,我已經對這些代碼進行了相當多的改進,它的功能就像一個魅力。沒有任何更改會影響該代碼的適用性。如果您可以等待幾天,我會提供我的工作。 – 2010-05-26 15:27:55

+0

@Pete - ping ...抱歉,沒有@你看到更新。 – 2010-05-26 15:36:57

相關問題