您将如何审核 ASP.NET 成员表,同时记录哪些用户进行了更改?

Posted

技术标签:

【中文标题】您将如何审核 ASP.NET 成员表,同时记录哪些用户进行了更改?【英文标题】:How would you audit ASP.NET Membership tables, while recording what user made the changes? 【发布时间】:2010-05-25 18:48:22 【问题描述】:

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

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

这似乎是一个常见问题。有谁知道当 ASP.NET Membership 建立数据库连接时我们可以访问的任何钩子?

【问题讨论】:

【参考方案1】:

更新 2: 恐怕在 AOP 方面看起来不太好 - 请参阅 Is is possible to intercept a static method on an object you don't own and did not create?

正如在 cmets 中提到的,看起来最好的选择是使用 Provider Toolkit 的提供者实现并将你的钩子连接到 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);

【讨论】:

谢谢,非常有趣的想法。我在想 AOP 方法是有意义的。不过,我不确定我现在是否想引入对 Castle 之类的东西的另一种依赖。现在我正在考虑使用 SqlMembershipProvider 的源代码,我刚刚发现它是可用的。我担心的一个问题是这个源代码是 2006 年的,我不知道它是否被后续的 asp.net 版本更新。 实际上,我还有一个关于 AOP 的问题,它对我们来说看起来不太好..***.com/questions/2912300/…,但是 - 我的下一个建议是使用基于工具包示例的自定义提供程序。多年来,我已经对代码进行了相当多的改进,它就像一个魅力。没有任何改变会影响该代码的适用性。如果你能等几天,我会让我的工作可用。 诗人。谢谢!很高兴知道 MS 提供的代码适合您。我确实修改了 GetConnection 并且可以正常工作。我唯一担心的是,如果 MS 多年来向这个库添加了安全功能,我不会拥有它们。到目前为止,它的工作方式与内置提供程序相同。

以上是关于您将如何审核 ASP.NET 成员表,同时记录哪些用户进行了更改?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 5.0 如何将多对多连接的 LINQ 转换为使用 ASP.NET 成员资格的交集表

请高手帮忙---asp.net 如何添加,修改,删除记录

如何使用 ASP.NET Core 更新由依赖表组成的记录 [关闭]

您将如何在 asp.net mvc 中实现面包屑助手?

如何让asp.net成员提供者和实体框架共享同一个数据库

工作流数据库表设计-ASP.NET