2

使用基于触发器的方法来审核日志记录,我正在记录对数据库中的表所做的更改的历史记录。我使用的方法(使用静态 sql 服务器登录)记录哪个用户进行了更改,涉及在每个数据库连接开始时运行一个存储过程。触发器在记录审计行时使用此用户名。(触发器由产品 OmniAudit 提供。)

但是,ASP.NET Membership 表主要通过 Membership API 进行访问。当 Membership API 打开其数据库连接时,我需要传入当前用户的身份。我尝试对 MembershipProvider 进行子类化,但我无法访问底层数据库连接。

看起来这将是一个普遍的问题。有谁知道当 ASP.NET Membership 建立数据库连接时我们可以访问的任何钩子?

4

1 回答 1

1

更新 2: 恐怕在 AOP 方面看起来不太好 - 请参阅Is is possible to intercept a static method on an object you don't own and didn't 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);
于 2010-05-26T09:26:19.733 回答