我正在使用Visual Studio内置的C#编写SQL Server应用程序。它是一个Windows窗体应用程序。该程序将安装在用户将运行它的网络上。
我正在努力解决的问题是如何管理配置文件。它有服务器用户名和密码供所有人查看。我尝试了Click Once和加密方案,但他们都要求程序在运行程序的计算机上运行。当我尝试从工作站运行它时,它失败了。这与How do I avoid having the database password stored in plaintext in sourcecode?不同,因为所有这些解决方案都建议使用集成安全性或基于机器的加密。这些选项都不适合我。
任何帮助都将深表感谢。
答案 0 :(得分:1)
不要以纯文本格式存储密码。期。完全停止。
您应该从SQL Server中获取提示。是的,您可以在web / app.config中以纯文本形式存储密码中的用户名。但对于生产服务器,你永远不应该。而不是生产部署,您应该具有使用集成安全性的配置。这允许通过访问由Windows安全处理的凭据而不是在配置文件中不安全地提升访问权限。
同样,您应该使用WindowsIdentity或OpenId之类的内容。然后,您可以在代码中传递身份验证令牌,而不是以纯文本格式存储凭据。
答案 1 :(得分:1)
这就是软件开发人员创建包含Web服务等中间件服务的多层设计的原因。可以在IIS中托管Web服务,并且可以将Windows帐户和密码配置到应用程序连接池的“应用程序标识”部分中。然后可以使用trusted_connection = true配置web.config连接字符串。以这种方式配置它使用Windows Data Protection API来保护身份。
答案 2 :(得分:0)
如果您的意思是app.config
的数据,那很简单!你必须使用这两个类:
EntityConnectionStringBuilder
SqlConnectionStringBuilder
我从这个页面了解到:Programmatic Connection Strings in Entity Framework 6这是非常好的指南。在任何情况下,该链接都没有帮助你!?就像谷歌这样:
C#在运行时定义连接字符串
将所有连接字符串放入代码后,您可以删除connectionStrings
app.config
个sa
标记中的任何敏感数据,因为您的应用不再使用它了!然后再次编译你的代码。
如果您在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="
// ;data source=MY-PC\SQLEXPRESS
// ;initial catalog=CMS
// ;user id=sa
// ;password=12345687
// ;MultipleActiveResultSets=True
// ;App=EntityFramework
// ""
// 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”和用户那里学到所有这些。
祝你好运