在 dotnet core 3.1 中使用 IDataProtectionProvider 安全地加密 appsettings 连接字符串
Securely encrypt appsettings connection string using IDataProtectionProvider in dot net core3.1
我已经在不同的控制器中成功地使用了 IDataProtectionProvider 到 encrypt/decrypt,没有任何问题。
但是我也想安全地使用相同的 encrypting/decrypting 存储在 appsettings.json 中的连接字符串。由于在注册 AddDataProtection 服务本身的同一 startup.cs 中调用了 GetConnectionString(),我真的不知道该怎么做。任何帮助表示赞赏。谢谢。
这是我的代码:
public void ConfigureServices(IServiceCollection services)
{
Action<GlobalData> gData = (g =>...);
services.Configure(gData);
services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<GlobalData>>().Value);
services.AddDataProtection();
services.AddControllersWithViews();
services.AddDbContext<ImgContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ImgContext")));
services.AddTransient<EmailHelper>();
services.AddIdentity<IdentityUser, IdentityRole>(options =>...).AddDefaultTokenProviders()
.AddEntityFrameworkStores<ImgContext>();
services.AddMvc(options =>...);
services.AddAuthorization(options =>...);
services.AddSingleton<DataProtectionPurposeStrings>();
}
据我所知,我们可以构建一个中间服务提供者并在 ConfigureServices 方法中解析已注册的服务。
例如:
我猜你使用 DataProtectionPurposeStrings
来保护或取消保护连接字符串。
您可以先使用Configuration.GetConnectionString("ImgContext")
获取加密连接字符串,然后使用DataProtectionPurposeStrings class解密。
如下所示:
注意:由于我不知道你是如何使用DataProtection进行解密和加密的,所以你需要自己修改代码。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection();
Action<GlobalData> gData = (g => ...);
services.AddSingleton<DataProtectionPurposeStrings>();
//Build an intermediate service provider
var sp = services.BuildServiceProvider();
//Resolve the services from the service provider
var datapro = sp.GetService<DataProtectionPurposeStrings>();
IDataProtector protector = datapro.CreateProtector("ConStrXyz");
services.Configure(gData);
services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<GlobalData>>().Value);
services.AddControllersWithViews();
//use datapro class to decrypt the connection string
services.AddDbContext<ImgContext>(options => options.UseSqlServer(protector.Unprotect(Configuration.GetConnectionString("ImgContext"))));
services.AddTransient<EmailHelper>();
services.AddIdentity<IdentityUser, IdentityRole>(options => ...).AddDefaultTokenProviders()
.AddEntityFrameworkStores<ImgContext>();
services.AddMvc(options => ...);
services.AddAuthorization(options => ...);
}
我已经在不同的控制器中成功地使用了 IDataProtectionProvider 到 encrypt/decrypt,没有任何问题。 但是我也想安全地使用相同的 encrypting/decrypting 存储在 appsettings.json 中的连接字符串。由于在注册 AddDataProtection 服务本身的同一 startup.cs 中调用了 GetConnectionString(),我真的不知道该怎么做。任何帮助表示赞赏。谢谢。 这是我的代码:
public void ConfigureServices(IServiceCollection services)
{
Action<GlobalData> gData = (g =>...);
services.Configure(gData);
services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<GlobalData>>().Value);
services.AddDataProtection();
services.AddControllersWithViews();
services.AddDbContext<ImgContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ImgContext")));
services.AddTransient<EmailHelper>();
services.AddIdentity<IdentityUser, IdentityRole>(options =>...).AddDefaultTokenProviders()
.AddEntityFrameworkStores<ImgContext>();
services.AddMvc(options =>...);
services.AddAuthorization(options =>...);
services.AddSingleton<DataProtectionPurposeStrings>();
}
据我所知,我们可以构建一个中间服务提供者并在 ConfigureServices 方法中解析已注册的服务。
例如:
我猜你使用 DataProtectionPurposeStrings
来保护或取消保护连接字符串。
您可以先使用Configuration.GetConnectionString("ImgContext")
获取加密连接字符串,然后使用DataProtectionPurposeStrings class解密。
如下所示:
注意:由于我不知道你是如何使用DataProtection进行解密和加密的,所以你需要自己修改代码。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection();
Action<GlobalData> gData = (g => ...);
services.AddSingleton<DataProtectionPurposeStrings>();
//Build an intermediate service provider
var sp = services.BuildServiceProvider();
//Resolve the services from the service provider
var datapro = sp.GetService<DataProtectionPurposeStrings>();
IDataProtector protector = datapro.CreateProtector("ConStrXyz");
services.Configure(gData);
services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<GlobalData>>().Value);
services.AddControllersWithViews();
//use datapro class to decrypt the connection string
services.AddDbContext<ImgContext>(options => options.UseSqlServer(protector.Unprotect(Configuration.GetConnectionString("ImgContext"))));
services.AddTransient<EmailHelper>();
services.AddIdentity<IdentityUser, IdentityRole>(options => ...).AddDefaultTokenProviders()
.AddEntityFrameworkStores<ImgContext>();
services.AddMvc(options => ...);
services.AddAuthorization(options => ...);
}