场景:
如果我在Vault中更改数据库密码,则由于身份验证错误,对数据库的所有请求都将失败。
我可以关闭所有容器,并在它们重新启动时使用新密码,但这不是我想要的。 有几种解决该问题的方法,但它们涉及不使用Service Collection,而我想使用它。
问题:
EF Core是否支持密码轮换,还是有一种方法可以在仍使用Service Collection的同时实现密码轮换?
答案 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)
最简单的解决方案是从库中获取用户名和密码。然后将其视为旋转键,将配置切换为其他用户名/密码,并在更改密码之前等待应用停止使用旧凭据。
另一种方法是在失败后重试之前重新获取凭据。