将 Audit.NET SqlDataProvider 与 Azure SQL 和托管身份结合使用

Using Audit.NET SqlDataProvider with Azure SQL and Managed Identity

我们正在使用 Audit.NET Sql 服务器数据提供程序将审核日志存储在我们的 Microsoft SQL 服务器中。我们目前正在迁移到使用 Azure SQL 和托管身份来访问数据库。我们无法让 Audit.NET 使用 Azure SQL 并使用托管身份连接到所述数据库。该文档未提供有关是否支持此功能的任何信息。

我们已经设法使用 Entity Framework Core 为我们自己的数据库连接执行此操作,方法是将访问令牌添加到上下文使用的 SQL 连接,如下所示:

SqlConnection sqlConnection = new SqlConnection(connectionString);
sqlConnection.AccessToken = new AzureServiceTokenProvider()
          .GetAccessTokenAsync("https://database.windows.net/")
          .Result;

这很好用。我们 运行 遇到的问题是我们希望通过 Audit.NET Sql 数据提供程序实现相同的目的。由于 SqlDataProvider 使用的 AuditContext 是内部的,我们无法将访问令牌传递给所使用的 SqlConnection。

我们想出的唯一解决方案是编写我们自己的数据提供程序,它实际上与 SqlDataProvider 相同,唯一的区别是所使用的上下文将在 Sql连接。这是这里唯一可行的解​​决方案,还是 Audit.NET 提供了一些其他方法来使其与 Azure SQL 和托管身份一起使用?

我认为最好的方法是公开一个可选设置以提供 DbContextOptions,您可以在其中设置一个拦截器,例如 中的拦截器,以便为连接设置 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));

更新

版本 16.2.1 添加了新的 DbContextOptions 设置