繁体   English   中英

如何在单层Winforms应用程序中安全地连接到SQL Server数据库?

[英]How to securely connect to a SQL Server database in a single tier Winforms application?

背景

我正在使用C#构建单层应用程序Winforms应用程序。 将SQL Server localdb数据库附加到在应用程序运行时运行的应用程序。 该计划是使用Windows身份验证来验证用户是否属于MyApplication角色/组并可以使用该应用程序。 但是,为了防止用户通过其他方式访问数据库,我正在考虑使用“应用程序角色”,以便只有一个SQL应用程序用户可以编辑db表。

我的理解是,为了使用应用程序角色,您需要在连接字符串中提供用户名和密码。 我可以加密此信息,但是很显然,在将其发送到数据库之前,需要对其进行解码。 这是单层应用程序中的问题吗? 还有什么其他选择?

若要使用应用程序角色,将使用sp_setapprole存储过程,在该过程中将提供应用程序角色的名称和密码,而不是在连接字符串中发送密码。 使用应用程序角色时,仍然可以使用普通登录名进行连接,但是一旦成功sp_setapprole ,您的连接就会失去其用户权限,而获得了应用程序角色的权限。 如果您有理由相信用户可能决定使用调试器来附加到您的进程中以提取密码,则将解码后的密码存储在内存中是一个问题。 如果您选择使用Windows计算机级别的密钥容器,则任何管理员还可以解密磁盘上的加密密码。 对于使用数据库的应用程序仅使用单个层是存在安全风险的,因此您必须根据应用程序周围的情况来决定是否要跳过几周的设计和开发,这是否是可以接受的风险。

来源: https : //technet.microsoft.com/zh-cn/library/ms190998(v=sql.110).aspx

我强烈建议实现一个Web API,以管理您的应用程序与数据库的交互以及安全性。 该Web api可以使用Windows“服务”帐户向数据库进行身份验证,而用户将使用其各自的Windows帐户向api进行身份验证。 这具有您无需考虑密码的额外好处。 就管理API权限而言,这是您自行设计和实施的问题。 您需要了解和处理的主要问题是唯一标识AD用户。 请查看此SO帖子以获取有关以下内容的更多信息: 我使用哪个Active Directory字段来唯一标识用户?

您的服务帐户将对数据库具有所有必需的权限,以执行应用程序需要执行的操作,但并非所有api用户都必须具有使用所有api函数的权限。 您将管理一个具有唯一标识的AD用户的存储,这些用户具有使用该应用程序的权限以及他们拥有哪些权限。 剩下的就是您所需的设计和实施细节。

仅以执行存储过程的权限定义用户。 这样,如果有人使用SQL Management Studio,则他/她将无法浏览/编辑表,甚至无法看到表名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM