登陆界面的数据存储(没有显式使用其他保存媒介)

创建一个WPF应用后,工程目录里会有一个默认app.config文件,这个文件里面可以存储一些程序常用的数据,

并且在编译后生成目录上会有一个xml文件生成,就是记录此数据的。

对于如下界面:


app.config数据中的格式为以下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
    <appSettings>
        <add key="server" value="127.0.0.1"/>
        <add key="database" value="VoiceRecord"/>
        <add key="userName" value="sa"/>
        <add key="password" value="x123!@#"/>
        <add key="savePath" value=""/>
    </appSettings>
</configuration>
其中<appSettings>节点中包含了上图中所显示的数据,savePath是修改后的,其实在代码中给了默认值。

在代码中可以通过ConfigurationManager类中的AppSettings属性来获取具体的值:

        /// <summary>
        /// 读取客户设置 settingName对应app.config的AppSettings里的Key
        /// </summary>
        /// <param name="settingName"></param>
        /// <returns></returns>
        public static string GetSettingString(string settingName)
        {
            try
            {
                string settingString = ConfigurationManager.AppSettings[settingName].ToString();
                return settingString;
            }
            catch (Exception)
            {
                return null;
            }
        }

更新其中的值:

        /// <summary>
        /// 更新设置
        /// </summary>
        /// <param name="settingName"></param>
        /// <param name="valueName"></param>
	/// 没有提供直接修改的值的方法,所以需要通过先删除后添加的方式修改值
        public static void UpdateSettingString(string settingName, string valueName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            if (ConfigurationManager.AppSettings[settingName] != null)
            {
                config.AppSettings.Settings.Remove(settingName);
            }
            config.AppSettings.Settings.Add(settingName, valueName);
            config.Save(ConfigurationSaveMode.Full);
            ConfigurationManager.RefreshSection("appSettings");
        }

在文本框里面添加LostFocus事件触发更新即可修改。

在生成的目录里面可以看到以*.exe程序结尾的程序和以*exe.Config结尾的文件,*.exe是程序,*exe.Config的就是appConfig.xml经过处理的配置文件了,里面的内容为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
    <appSettings>
        <add key="server" value="127.0.0.1"/>
        <add key="database" value="VoiceRecord"/>
        <add key="userName" value="sa"/>
        <add key="password" value="x123!@#"/>
        <add key="savePath" value=""/>
    </appSettings>
</configuration>
可以看到,生成数据里面和之前是一样的。
然而到这里,问题来了,登陆密码及用户名这样敞开的真的好吗?

对于一些隐秘数据可以采用加密的方式输出。登陆界面上需要保存用户名和密码之类的数据,生成的xml文件不能以明文的方式存储,不然就可以查看到,这是不安全的,所以在生成过程中可以采用加密的方式。

Configuration类中包含的ConfigurationSection提供加密的方法,示例代码:

        //加密app.Config中的指定节
        // sectionName为节点 eg:appSettings
        private void ProtectSection(string sectionName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.GetSection(sectionName);
            if (section != null && !section.SectionInformation.IsProtected)
            {
                section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                config.Save();
            }
        }
经过加密后的*exe.Config文件里面显示为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
    <appSettings configProtectionProvider="DataProtectionConfigurationProvider">
        <EncryptedData>
            <CipherData>
                <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAQN3ZN4bHl0+6ROYrpkB78gQAAAACAAAAAAADZgAAwAAAABAAAAB63UqbYejevg4TL4eTUdC6AAAAAASAAACgAAAAEAAAAMk5zWOml6z93QekcSOuo33oAQAA3hi+/3jHcPSPuRODe23cGhda0ZaC33MIU7ZIYqg3wcI44c7GxCmiCH5sB7vFGb4rAwOuJi20nxWpMOTwklqAyxBxlMtTVDvf6KT1eo89tZ8dAGhHt1Dmp2jSEZL2es/719ALgTf0V1E/4Q3ZjOQ14i/eXxM4aVypiVswXwJLZb7QT0ohIQq5MDeEuyR4nstl/pMdH5MG8F8vrE3YC7VIUWqC+W15V6YInO4fICirLyYi/kxWA/5ueHivGbJR/+l+F54BZBc0OAwTEnw58ZYI9UFOP7WhXUs3HyLH0sMS1B/5KVxZLpPvNyzj9b9aSReUICRSyQYDQAjq08g91gWG6mTkcMfJL/KjkQaYW8Yux5Me4+VaeXdk0AVdRzISDFRGyadHs3KtVXHPhK7KEHWmF6bS94t73ZrWsa0qnArULsb4OIlIysdW6WTVDNC+tZpNFLVuS3Y5JznOxGYsHShPsF4aXXksYJSK3+Hb0jjKoJFEK5xXs9BNA/+Pd0PIIGMHItTe9x/igjCnfQRZC2jrkUh65m6XzaKYNc1BjZRPAfv9qRc8cq0eUy9FiCp8HztzwviDl3P4kLm2jCzmrK4lpRTbHYwhBtIzSRU/V/NwQPNztnyUwC53LtcWUFUFZUk/BZkJ3U1id1wUAAAAVaa81Jhbj9dasmvS2T96bjMNq44=</CipherValue>
            </CipherData>
        </EncryptedData>
    </appSettings>
</configuration>
可以看到<appSettings>节点已经显示为加密了。

在使用过程中,并不需要去界面,这部分会自动完成的,保证在使用过程中数据使用的是解密后的数据。下面还是提供对应的解密方法

解密方法:

//解密app.Config中的指定节
        private void UnProtectSection(string sectionName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.GetSection(sectionName);
            if (section != null && section.SectionInformation.IsProtected)
            {
                section.SectionInformation.UnprotectSection();
                config.Save();
            }
        }
           

使用Configuretion类需要引用System.Configuration命名空间。

选择路径框需要引用System.Windows.Forms命名空间以及添加System.Windows.Forms程序集。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值