我已经为我的问题寻找了多种解决方案。
我有一个程序,几乎需要一直从数据库中插入/更新/选择数据。该程序本身可以工作,但是问题是,它也应该在我们的员工的生产系统中工作,并且这必须是安全的。
主要内容之一是: 我如何管理该程序可以从我们的Staff PC连接到数据库,而无需在连接字符串中提及用户名和密码。 有人说,我应该使用Windows身份验证。
但是我在哪里提到将用于连接数据库的用户/密码?我需要它以某种方式工作,人们看不到用于管理DB-Server的Login-Data,但是程序本身仍然应该能够连接到它。
我该怎么办?
以下是我的Visual Studio为我生成的2个连接字符串:
"Data Source=domain,Port;Initial Catalog=Zeiterfassung;Persist Security Info=True;User ID=sa;Password=PW"
"Data Source=domain;Initial Catalog=Zeiterfassung;Integrated Security=True"
第一个可以正常工作,但是密码在此处可见。那不应该。即使我将其存储在程序中的某个位置,反编译器仍将使其可见。
第二个字符串可以在任何具有Internet连接和程序的PC上真正使用吗?因此,没有人能看到需要在程序外部或管理员本身之外操作该程序的信息吗?现在,我可以在授权的PC上进行测试,该PC的用户是在DB-Server上作为授权手动添加的,但是其他用户又是什么?只能使用本程序连接到DB,而不能使用其在MSSMS中的Windows帐户手动连接到DB。最后一件事真的应该被禁止。
一个简单的代码片段,以阐明“连接”示例的外观:
class Utility {
private static SqlConnection con;
static Utility() {
con = new SqlConnection();
con.ConnectionString = Properties.Settings.Default.DBPath1;
}
public static DataTableReader getSelectDataTableReader(string selectCommand, SqlParameter[] parameter) {
SqlDataAdapter adapter = new SqlDataAdapter(selectCommand, con);
if (parameter.Length > 0) {
adapter.SelectCommand.Parameters.AddRange(parameter);
}
DataSet ds = new DataSet();
try {
adapter.Fill(ds, "Table");
} catch (Exception ex) {
writeToLog(ex.Message);
return null;
}
return ds.Tables["Table"].CreateDataReader();
}