如何保护我的配置文件

时间:2016-11-08 22:55:05

标签: c# sql-server visual-studio configuration

我正在使用Visual Studio内置的C#编写SQL Server应用程序。它是一个Windows窗体应用程序。该程序将安装在用户将运行它的网络上。

我正在努力解决的问题是如何管理配置文件。它有服务器用户名和密码供所有人查看。我尝试了Click Once和加密方案,但他们都要求程序在运行程序的计算机上运行。当我尝试从工作站运行它时,它失败了。这与How do I avoid having the database password stored in plaintext in sourcecode?不同,因为所有这些解决方案都建议使用集成安全性或基于机器的加密。这些选项都不适合我。

任何帮助都将深表感谢。

3 个答案:

答案 0 :(得分:1)

不要以纯文本格式存储密码。期。完全停止。

您应该从SQL Server中获取提示。是的,您可以在web / app.config中以纯文本形式存储密码中的用户名。但对于生产服务器,你永远不应该。而不是生产部署,您应该具有使用集成安全性的配置。这允许通过访问由Windows安全处理的凭据而不是在配置文件中不安全地提升访问权限。

同样,您应该使用WindowsIdentityOpenId之类的内容。然后,您可以在代码中传递身份验证令牌,而不是以纯文本格式存储凭据。

答案 1 :(得分:1)

这就是软件开发人员创建包含Web服务等中间件服务的多层设计的原因。可以在IIS中托管Web服务,并且可以将Windows帐户和密码配置到应用程序连接池的“应用程序标识”部分中。然后可以使用trusted_connection = true配置web.config连接字符串。以这种方式配置它使用Windows Data Protection API来保护身份。

答案 2 :(得分:0)

如果您的意思是app.config的数据,那很简单!你必须使用这两个类:

EntityConnectionStringBuilder

https://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnectionstringbuilder(v=vs.110).aspx

SqlConnectionStringBuilder

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder(v=vs.110).aspx

我从这个页面了解到:Programmatic Connection Strings in Entity Framework 6这是非常好的指南。在任何情况下,该链接都没有帮助你!?就像谷歌这样:

C#在运行时定义连接字符串

将所有连接字符串放入代码后,您可以删除connectionStrings app.configsa标记中的任何敏感数据,因为您的应用不再使用它了!然后再次编译你的代码。

如果您在EF中使用DB First,那么您也可以查看本指南:How to set Connection String with Entity Framework

<强>更新:

我添加了两个我管理的类,并用程序化(动态)创建连接字符串,一个属于我使用SQL Server Compact Edition(SQL Server CE)的我的Entity Framework项目,第二个属于另一个实体框架项目我使用SQL Server Express 2014进行SQL Server身份验证(使用public static string GetDBConnectionString(string dataParentPath = "") { EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); SqlCeConnectionStringBuilder sqlCEBuilder = new SqlCeConnectionStringBuilder(); if (string.IsNullOrEmpty(dataParentPath) == true) dataParentPath = @"C:\MyDBFolder\CMS.sdf"; sqlCEBuilder.DataSource = dataParentPath; sqlCEBuilder.Password = "12345687"; sqlCEBuilder.MaxDatabaseSize = 4090; entityBuilder.Metadata = "res://*/CMS.csdl|res://*/CMS.ssdl|res://*/CMS.msl"; entityBuilder.ProviderConnectionString = sqlCEBuilder.ToString(); entityBuilder.Provider = "System.Data.SqlServerCe.4.0"; return entityBuilder.ToString(); } 用户名)。我会在这里留下这两种方法,万一有人需要它们:

这属于我的SQL Server CE项目:

using System;
using System.Collections.Generic;
using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CMS
{
    class mySettings
    {
        public static string GetDBConnectionString()
        {
            // **************************************************
            // This is my "ConnectionString" from App.config file.
            // <connectionStrings>
            //      <add name="CMSEntities" 
            //          connectionString=
            //              "metadata=res://*/CMS.csdl|res://*/CMS.ssdl|res://*/CMS.msl
            //                  ;provider=System.Data.SqlClient
            //                  ;provider connection string=&quot
            //                  ;data source=MY-PC\SQLEXPRESS
            //                  ;initial catalog=CMS
            //                  ;user id=sa
            //                  ;password=12345687
            //                  ;MultipleActiveResultSets=True
            //                  ;App=EntityFramework
            //              &quot;"
            //      providerName="System.Data.EntityClient" />
            //</connectionStrings>
            // **************************************************

            string metaData = "res://*/CMS.csdl|res://*/CMS.ssdl|res://*/CMS.msl";
            string providerName = "System.Data.SqlClient";

            string dataSource = @"MY-PC\SQLEXPRESS";
            string databaseName = "CMS"; // = InitialCatalog
            string userID = "sa";
            string password = "12345687";
            string appName = "EntityFramework";

            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();

            // = = = = = = = = = = = = = = = =
            sqlBuilder.DataSource = dataSource;
            sqlBuilder.InitialCatalog = databaseName;
            sqlBuilder.MultipleActiveResultSets = true;
            sqlBuilder.UserID = userID;
            sqlBuilder.Password = password;
            sqlBuilder.ApplicationName = appName;


            // = = = = = = = = = = = = = = = =
            entityBuilder.Provider = providerName;
            entityBuilder.Metadata = metaData;
            entityBuilder.ProviderConnectionString = sqlBuilder.ConnectionString;

            return entityBuilder.ToString();
        }
    }
}

这属于我的SQL Server Express项目,使用SQL Server身份验证:

CMSEntities

如您所见,两个项目中的我的数据库具有相同的名称“CMS”,因此其实体将命名为“DbContext”。现在! 您必须覆盖partial构造函数。这是重要但最简单的部分!比我更好的描述来自这个页面“http://www.cosairus.com/Blog/2015/3/10/programmatic-connection-strings-in-entity-framework-6”:

  

现在你的实体模型从DbContext扩展而DbContext提供了一个   构造函数传递一个连接字符串,但你的实体模型做了   不要为你重载那些构造函数。为了访问   构造函数重载,您将需要为其创建一个新类   您的实体模型数据库上下文与您的命名空间相同   具有所需构造函数签名的实体模型。专业提示:确定   将cs文件的文件名命名为与实体不同的名称   在未来生成的代码执行的情况下建模数据库上下文   不会覆盖您的更改。

所以我在我的项目的 root 上构建了一个类,该类必须是using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CMS // Your Project Namespace { public partial class CMSEntities : DbContext { public CMSEntities(string connectionString) : base(connectionString) { } } }

    using (CMSEntities db = new CMSEntities(CMSSettings.GetDBConnectionString()))
    {
        // Do your DB stuff here...
    }

并且无论何时我想访问我的数据库,我都会使用此代码:

{"1": 1, "2": 2, "3": 3}

我希望它可以帮助您或其他人从我的网站“stackoverflow”和用户那里学到所有这些。

祝你好运