gpt4 book ai didi

c# - DBContext 的 Azure KeyVault : "No database provider has been configured for this DbContext"

转载 作者:行者123 更新时间:2023-12-03 04:49:59 35 4
gpt4 key购买 nike

我正在使用 .NET Core 2.1 构建 Web API。这将作为 Azure Web 应用程序托管。我想将数据库连接字符串保留在 Azure Key Vault 中。这是我放入 Startup.cs ConfigureServices 方法中的代码:

services.AddDbContext<dbContext>(async options => 
{
var keyVaultUri = new Uri("https://xxxxxxxxx.vault.azure.net/");
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
SecretBundle connectionStringSecret = await keyVaultClient.GetSecretAsync(keyVaultUri + "secrets/DBConnectionString");
options.UseSqlServer(connectionStringSecret.Value);
});

当我尝试对注入(inject)了 dbContext 的 Controller 进行 HTTP Get 时,出现以下错误:

InvalidOperationException: No database provider has been configured 
for this DbContext. A provider can be configured by overriding the
DbContext.OnConfiguring method or by using AddDbContext on the
application service provider. If AddDbContext is used, then also
ensure that your DbContext type accepts a DbContextOptions<TContext>
object in its constructor and passes it to the base constructor for
DbContext.

我假设这是因为我使用异步 lambda 从 Key Vault 获取连接字符串,但是,我不确定该怎么办。这是从 Azure KeyVault 获取连接字符串以在 Startup.cs 中使用的正确方法吗?我应该用不同的方式来做这件事吗?任何帮助,将不胜感激。谢谢。

最佳答案

您的配置失败的原因是回调现在是async void。从 lambda 来看,这一点并不明显,但它实际上是“即发即忘”。当您等待 Key Vault 客户端时,它会从回调中返回,而不配置提供程序。

至于解决方案,我认为最好将 key 保管库 secret 添加到配置系统中,这样您就可以从那里使用它们,就像它们来自 JSON 文件或任何其他源一样。

我不久前写过一篇关于此的文章:https://joonasw.net/view/aspnet-core-azure-keyvault-msi 。我在文章中使用托管身份进行身份验证,但我看到您也在使用它:)

以下示例介绍了如何将 Key Vault 配置为 ASP.NET Core 2.x 中的配置源:

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((ctx, builder) =>
{
//Build the config from sources we have
var config = builder.Build();
//Add Key Vault to configuration pipeline
builder.AddAzureKeyVault(config["KeyVault:BaseUrl"]);
})
.Build();

我在文章中的示例实际上有点过于冗长,因为这将在内部使用 AzureServiceTokenProvider 来获取 token 。

您需要Microsoft.Extensions.Configuration.AzureKeyVault获取 Key Vault 的配置提供程序。

Key Vault 中的 secret 命名很重要。例如,我们将覆盖以下连接字符串:

{
"ConnectionStrings": {
"DefaultConnection": "..."
}
}

您必须创建一个名为 ConnectionStrings--DefaultConnection 的 key ,并将连接字符串作为值。

然后在配置时,您只需使用 Configuration["ConnectionStrings:DefaultConnection"] 来获取连接字符串。如果添加了 Key Vault 配置并且找到了具有正确名称的 secret ,它将来自 Key Vault。

关于c# - DBContext 的 Azure KeyVault : "No database provider has been configured for this DbContext",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53103236/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com