【问题标题】:Does Entity Framework Core support database password rotationEntity Framework Core 是否支持数据库密码轮换
【发布时间】:2019-09-16 07:30:54
【问题描述】:

场景:

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

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

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

问题:

EF Core 是否支持密码轮换,或者有没有办法在仍然使用服务集合的同时实现这一点?

【问题讨论】:

  • 你基本上是在问如何在运行时控制数据库上下文连接字符串?
  • 上下文驻留在服务集合中是其中很大一部分,并且还有一个问题是密码更改时请求失败。因此,它不仅仅是在运行时更改连接字符串。但是,如果您对此有任何建议,可能会有所帮助。
  • 所以你可以添加一个 dbcontext 作为临时服务并传递一个委托来创建 db 上下文的实例。这样,您将删除连接字符串的静态特性,并能够在运行时控制数据库上下文对象的创建。
  • 有趣,如果您有一个或两个班轮示例,请添加一个答案,我会尝试并接受它是否有效。谢谢。
  • 您已经标记了一个答案,但是here 的解决方案可能对您来说也很有趣。我认为当密码更改时,IOptions 会自动替换它。

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


【解决方案1】:

由于在启动期间从 HashiCorp 保管库读取数据库密码,也许您可​​以考虑使用健康检查功能 (https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-2.2) 来设置实时健康检查端点。

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

【讨论】:

    【解决方案2】:

    您应该能够将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);
         });
    

    【讨论】:

      【解决方案3】:

      最简单的解决方案是从保管库中获取用户名密码。然后将其视为密钥轮换,将配置切换为不同的用户名/密码,并等待应用程序停止使用旧凭据,然后再更改密码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 2013-10-14
        • 1970-01-01
        相关资源
        最近更新 更多