问题描述
我们使用 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 版中添加