将 Audit.NET SqlDataProvider 与 Azure SQL 和托管标识结合使用

问题描述

我们使用 Audit.NET sqlServer 数据提供程序将审核日志存储在我们的 Microsoft sql Server 中。我们目前正在迁移到使用带有托管标识的 Azure sql 来访问数据库。我们无法让 Audit.NET 与 Azure sql 一起工作,并无法使用托管标识连接到所述数据库。该文档未提供有关是否支持功能的任何信息。

通过向上下文使用的 sql 连接添加访问令牌,我们已经成功地使用 Entity Framework Core 为我们自己的数据库连接做到了这一点,如下所示:

sqlConnection sqlConnection = new sqlConnection(connectionString);
sqlConnection.Accesstoken = new AzureServicetokenProvider()
          .GetAccesstokenAsync("https://database.windows.net/")
          .Result;

这工作得很好。我们遇到的问题是我们希望使用 Audit.NET sql 数据提供程序实现相同的目标。由于 sqlDataProvider 使用的 AuditContext 是内部的,我们无法将访问令牌传递给使用的 sqlConnection。

我们提出的唯一解决方案是编写我们自己的数据提供程序,它与 sqlDataProvider 几乎相同,唯一的区别是使用的上下文将在 sqlConnection 上设置访问令牌。这是这里唯一可行的解​​决方案,还是 Audit.NET 提供了一些其他方法来使其与 Azure sql 和托管标识一起使用?

解决方法

我认为最好的方法可能是公开一个可选设置以提供 DbContextOptions,您可以在其中设置一个拦截器,例如 here 中的拦截器来设置连接的 AccessToken

所以你可以像这样初始化你的配置:

Audit.Core.Configuration.Setup()
    .UseSqlServer(sql => sql
        .ConnectionString("connection string")
        .DbContextOptions(new DbContextOptionsBuilder()
            .AddInterceptors(new AzureAuthenticationInterceptor(new AzureServiceTokenProvider()))
            .Options));

Audit.Core.Configuration.Setup()
    .UseSqlServer(sql => sql
        .DbContextOptions(new DbContextOptionsBuilder()
            .UseSqlServer("connection string")
            .AddInterceptors(new AzureAuthenticationInterceptor(new AzureServiceTokenProvider()))
            .Options));

更新

新的 DbContextOptions 设置已在 16.2.1 版中添加

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...