微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在dot net core3.1中使用IDataProtectionProvider安全加密appsettings连接字符串

如何解决在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 举报,一经查实,本站将立刻删除。