如何解决在dot net core3.1中使用IDataProtectionProvider安全加密appsettings连接字符串
我已成功使用 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 => ...);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。