代码之家  ›  专栏  ›  技术社区  ›  Pete

在记录用户所做的更改时,如何审核ASP.NET成员资格表?

  •  2
  • Pete  · 技术社区  · 15 年前

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

    但是,ASP.NET成员资格表主要通过成员资格API访问。当成员资格API打开其数据库连接时,我需要传入当前用户的标识。我尝试对MembershipProvider进行子类化,但无法访问基础数据库连接。

    这似乎是一个常见的问题。当ASP.NET成员资格建立其数据库连接时,是否有人知道我们可以访问的任何挂钩?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

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

    正如在评论中提到的,最好的办法是使用提供者工具包实现提供者,并将您的钩子连接到 SqlConnectionHelper.GetConnection()

    我使用工具箱代码,多年来我已经彻底、可靠地清除了这些代码,没有任何问题。如果你感兴趣的话,我在4点确认一下,然后打包。


    更新:

    好吧,我想我更了解你的需要,告诉我我是否正确:

    sqlMembershipProvider使用帮助程序类, System.Web.DataAccess.SqlConnectionHolder 对于所有的数据访问。

    我没有这样做,但是根据我收集到的信息,您可以使用AOP实现(如Castle dynamicProxy(或利用它的库之一)截获调用来构建这个对象,并在那里建立连接。

    有经验的人能证实或否认这一点吗?


    原始答案:

    不需要从sqlMembershipProvider派生。进去拿你需要的。

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