gpt4 book ai didi

visual-studio-2017 - ef核心迁移不能使用 secret 管理器

转载 作者:行者123 更新时间:2023-12-05 00:13:23 25 4
gpt4 key购买 nike

当我创建 .net 核心 Web 应用程序时,我在测试期间使用 secret 管理器。我通常能够创建一个新的 web 项目(mvc 和 web api),右键单击该项目并选择“管理用户 secret ”。这将打开一个 json 文件,我在其中添加 secret 。然后我在我的 startup.cs 中使用它,如下所示:

services.AddDbContext<ApplicationDbContext>(options =>
options.UseMySql(Configuration["connectionString"]));

该网站可以正常工作,并且可以很好地连接到数据库。但是,当我尝试使用 ef 核心迁移命令时,例如 add-migration ,他们似乎无法从 secret 管理器访问连接字符串。我收到错误消息“连接字符串不能为空”。当我硬编码 Configuration["connectionString"] 时错误消失了与实际的字符串。我已经在线检查并检查了 .csproj 文件,它们已经包含以下几行:
<UserSecretsId>My app name</UserSecretsId>

然后:
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />

我需要添加什么以便迁移可以访问连接字符串吗?

更新

我在上下文类中只有一个构造函数:
public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options)
{
}

最佳答案

我目前也遇到了这个确切的问题。我想出了一个目前可行的解决方案,但充其量可能会认为是困惑的。
我创建了一个配置类,它在请求时提供配置接口(interface):

public static class Configuration
{
public static IConfiguration GetConfiguration()
{
return new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.AddUserSecrets<Startup>()
.AddEnvironmentVariables()
.Build();
}
}
在迁移中,您可以获取配置文件并访问其 UserSecrets,如下所示:
protected override void Up(MigrationBuilder migrationBuilder)
{
var conf = Configuration.GetConfiguration();
var secret = conf["Secret"];
}
我已经测试了使用这些用户 secret 创建一个 SQL 脚本,并且它可以工作(您显然不希望保留脚本,因为它会暴露实际的 secret )。
更新
上述配置也可以设置到 BuildWebHost 中的 Program.cs 类中方法:
var config = new ConfigurationBuilder().AddUserSecrets<Startup>().Build();

return WebHost.CreateDefaultBuilder(args).UseConfiguration(config)...Build()
或者如果使用 that Convention 在启动构造函数中
更新 2(解释)
事实证明,这个问题是因为迁移脚本在环境设置为“生产”的情况下运行。 secret 管理器预设为仅在“开发”环境中工作(有充分理由)。 .AddUserSecrets<Startup>()函数只是为所有环境添加 secret 。
为确保不会将其设置为您的生产服务器,我注意到有两种解决方案,这里建议使用一种: https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell

Set env:ASPNETCORE_ENVIRONMENT before running to specify the ASP.NET Core environment.


此解决方案意味着无需设置 .AddUserSecrets<Startup>()将来在计算机上创建的每个项目上。但是,如果您碰巧在其他计算机上共享此项目,则需要在每台计算机上进行配置。
第二种解决方案是设置 .AddUserSecrets<Startup>()仅在这样的调试版本中:
return new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
#if DEBUG
.AddUserSecrets<Startup>()
#endif
.AddEnvironmentVariables()
.Build();
附加信息
配置接口(interface)可以在其构造函数中传递给 Controller ​​,即
private readonly IConfiguration _configuration;
public TestController(IConfiguration configuration)
{
_configuration = configuration;
}
因此,可以通过访问 _configuration["secret"] 在该 Controller 中访问任何 secret 和应用程序设置。 .
但是,如果您想从例如存在于 Web 应用程序本身之外的迁移文件访问应用程序 secret ,则需要遵守原始答案,因为没有简单的方法(据我所知)访问这些否则 secret (我能想到的一个用例是使用管理员和主密码为数据库播种)。

关于visual-studio-2017 - ef核心迁移不能使用 secret 管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758249/

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