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

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

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

我可以关闭所有容器,当它们重新启动时,将拥有新的密码,但这不是我想要做的。 有一些笨拙的方法可以解决这个问题,但它们涉及不使用服务集合,而我想使用它。

问题:

EF Core是否支持密码轮换,或者是否有一种方法可以在仍然使用服务集合的情况下实现此目的?

最初的回答: EF Core不会自动旋转密码。你可以使用IOptionsSnapshot和IOptionsMonitor来获取选项的快照,并根据需要更新连接字符串。这将允许您更改Vault中的密码且无需停止应用程序。

你基本上是在问如何在运行时控制数据库上下文连接字符串吗? - Vidmantas Blazevicius
上下文驻留在服务集合中是其中的重要部分,同时还存在密码更改时请求失败的问题。因此,这不仅仅是在运行时更改连接字符串。但如果您对如何做出建议,那可能会很有帮助。 - Bryan
1
所以你只需要将dbcontext添加为瞬态服务,并传递一个委托来创建db context的实例。这样,你就可以消除连接字符串的静态特性,并能够在运行时控制db context对象的创建。 - Vidmantas Blazevicius
有趣的,如果你有一个一两行的例子,请在回答中添加它,我会尝试并接受它是否有效。谢谢。 - Bryan
2
你已经标记了一个答案,但是这个链接中的解决方案对你也可能很有帮助。我认为当密码发生变化时,IOptions会自动替换它。 - user4864425
感谢@RuardvanElburg。 - Bryan
3个回答

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
最简单的解决方案是从保险库中获取用户名和密码。然后将其视为密钥轮换,将配置切换到不同的用户名/密码,并等待应用程序停止使用旧凭据,然后更改密码。
另一种方法是在失败重试之前重新获取凭据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接