【问题标题】:Using Audit.NET SqlDataProvider with Azure SQL and Managed Identity将 Audit.NET SqlDataProvider 与 Azure SQL 和托管标识一起使用
【发布时间】:2020-12-24 15:10:02
【问题描述】:

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

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

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

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

我们想出的唯一解决方案是编写我们自己的 Data Provider,它与 SqlDataProvider 几乎相同,唯一的区别是使用的 Context 将在 SqlConnection 上设置一个访问令牌。这是这里唯一可行的解​​决方案,还是 Audit.NET 提供了一些其他方法来使其与 Azure SQL 和托管标识一起使用?

【问题讨论】:

标签: .net-core azure-sql-database audit.net audit.net.sqlserver


【解决方案1】:

我认为最好的方法是公开一个可选设置以提供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

【讨论】:

  • 非常感谢,这正是我想要的!
猜你喜欢
  • 2021-08-08
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2021-11-12
  • 2022-11-11
  • 2020-10-04
  • 2021-10-11
相关资源
最近更新 更多