使用基于触发器的方法进行审计日志记录,我记录对数据库中的表所做的更改的历史记录。我使用的方法(使用静态 SQL Server 登录)记录哪个用户进行了更改,涉及在每个数据库连接开始时运行一个存储过程。触发器在记录审计行时使用此用户名。 (触发器由产品 OmniAudit 提供。)
但是,ASP.NET 成员资格表主要通过成员资格 API 进行访问。当会员 API 打开其数据库连接时,我需要传入当前用户的身份。我尝试对 MembershipProvider 进行子类化,但无法访问底层数据库连接。
看来这将是一个常见问题。有谁知道当 ASP.NET 会员建立数据库连接时我们可以访问任何钩子吗?
更新2:恐怕 AOP 前端看起来不太好 - 看看是否可以拦截您不拥有且未创建的对象上的静态方法? https://stackoverflow.com/questions/2912300/is-is-possible-to-intercept-a-constructor-on-a-class-you-do-not-own
正如评论中提到的,看起来最好的选择是使用提供程序工具包的提供程序实现并将您的挂钩连接到SqlConnectionHelper.GetConnection()
我使用工具包代码,多年来我已经对其进行了大量、可靠的清理,没有出现任何问题。如果您有兴趣,让我确认 4.0 并打包它。
Update:
好的,我想我更好地理解您的需求,请告诉我我是否正确:
您需要提供商正在使用的实际连接吗?
SqlMembershipProvider 使用辅助类,System.Web.DataAccess.SqlConnectionHolder
,用于所有数据访问。
我还没有这样做,但根据我收集的信息,您可以使用 AOP 实现(例如 Castle DynamicProxy(或利用它的库之一))拦截调用来构建此对象,并在那里建立连接。
有经验的人可以证实还是否认这一点吗?
原答案:
无需从 SqlMembershipProvider 派生。只要进去拿你需要的东西就可以了。
string connectionString =
typeof(SqlMembershipProvider)
.GetField("_sqlConnectionString",BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(Membership.Provider);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)