在 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 => ...);

    }