问题描述
我已成功使用 IDataProtectionProvider 在不同的控制器中进行加密/解密,并且没有任何问题。 但是,我也想将其用于安全加密/解密存储在appsettings.json中的连接字符串。由于GetConnectionString()在AddDataProtection服务本身已注册的同一startup.cs中调用,所以我真的不知道该怎么做。任何帮助表示赞赏。谢谢。 这是我的代码:
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类对其进行解密。
像下面这样:
注意:由于我不知道如何使用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 => ...);
}