Entity Framework Core是否支持数据库密码轮换

时间:2019-04-26 18:51:52

标签: c# entity-framework entity-framework-core asp.net-core-webapi

场景:

    NET Core 2.2中的
  1. Web Api应用程序,它部署在多个容器上。
  2. 在启动中,我从HashiCorp Vault中读取数据库密码,并将其放入我的连接字符串中。
  3. 我将Entity Framework Core上下文添加到服务集合中。
  4. 我在多个控制器中使用上下文。

如果我在Vault中更改数据库密码,则由于身份验证错误,对数据库的所有请求都将失败。

我可以关闭所有容器,并在它们重新启动时使用新密码,但这不是我想要的。 有几种解决该问题的方法,但它们涉及不使用Service Collection,而我想使用它。

问题:

EF Core是否支持密码轮换,还是有一种方法可以在仍使用Service Collection的同时实现密码轮换?

3 个答案:

答案 0 :(得分:3)

您应该能够将DbContext添加到DI中并传递一个委托,该委托创建的实例实质上是控制连接字符串的静态性质,并在运行时确定正确的实例。

services.AddScoped<YourDbContext>(svc =>
     {
         var connString = ... logic to get the conn string with the right password from HashiCorp vault;
         var dbContextOptions = new DbContextOptionsBuilder<YourDbContext>();
         dbContextOptions.UseSqlServer(connString); //Or w/e ef provider for db you use
         return new YourDbContext(dbContextOptions.Options);
     });

答案 1 :(得分:1)

由于在启动过程中从HashiCorp库中读取了数据库密码,因此您也许可以考虑使用运行状况检查功能(https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-2.2)来设置实时运行状况检查端点。

然后使用您的容器管理工具来探测端点,并在容器失败(即由于连接字符串已过时而无法连接到数据库)时重新启动容器。

答案 2 :(得分:1)

最简单的解决方案是从库中获取用户名密码。然后将其视为旋转键,将配置切换为其他用户名/密码,并在更改密码之前等待应用停止使用旧凭据。

另一种方法是在失败后重试之前重新获取凭据。