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

    }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...