【问题标题】:How to securely connect to a SQL Server database in a single tier Winforms application?如何在单层 Winforms 应用程序中安全地连接到 SQL Server 数据库?
【发布时间】:2016-06-25 16:51:18
【问题描述】:

背景

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

问题

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

【问题讨论】:

    标签: c# .net sql-server database winforms


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。实际上,我在研究中遇到过这种方法,但是我试图将尽可能多的应用程序保留在 C#/.net 中,包括业务逻辑和 CRUD 操作(通过实体框架)。对 CRUD 使用过程会带我走向我不希望采取的方向。
    • 您可以将实体框架与存储过程一起使用,仅供参考。
    • 也许我需要一些观点,但除了与安全相关的优势之外,使用过程还有什么好处?从调试的角度来看,我过去使用过程的经验令人沮丧。我觉得将所有应用程序逻辑保留在 C# 中是比较有益的,包括初始开发速度和长期维护。
    • @Andrew 如果您将业务逻辑移至存储过程,您将实现真正的客户端-服务器系统。主要优点是多用户(同时)工作中的数据保护。例如,如果您同时在 5 台不同的 PC 上为同一项目处理 C# 端的库存数量 - 您将需要复杂的逻辑来获得正确的值。如果使用存储过程实现相同,则所有当前数量值仅保存在数据库中,不能用旧/不正确的值覆盖。此外,客户端不需要强大的硬件 - 所有繁重的计算都在服务器上进行。
    • 这听起来确实有好处。但是,在@Jakotheshadows 回答上建立对话,如果我最终构建一个 2 层系统,其中单个服务(Web API)/数据库向多个客户端提供数据,我将获得你提到的好处,同时保持 C# 中的业务逻辑,不是吗?
    【解决方案2】:

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

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

    我强烈建议实施 Web api 来管理应用程序与数据库的交互以及安全性。这个 web api 可以使用 windows “服务” 帐户对数据库进行身份验证,用户将使用他们各自的 windows 帐户对 api 进行身份验证。 这还有一个额外的好处,就是您永远不必考虑密码。 至于管理 API 权限,这是一个由您自行设计和实施的问题。您需要了解和处理的主要问题是唯一标识 AD 用户。请查看此 SO 帖子以获取更多信息:What Active Directory field do I use to uniquely identify a user?

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

    【讨论】:

    • 谢谢@Jakotheshadows。因此,如果安全性对我来说是一个更大的问题,那么方法是将其分为两层。你是说我应该,例如,创建一个 Web API 服务来隐藏我的业务逻辑和数据库,然后将 Winforms 应用程序放在另一层吗?那么,运行 Web API 服务的服务器将是唯一可以访问数据库的机器/用户吗?
    • 是的,您的服务可以使用 Windows 身份验证“服务”帐户。用户可以使用他们的 AD 帐户对服务进行身份验证,您可以为其管理 API 权限,并且当他们在数据库中执行 api 操作时,它将使用应用程序服务帐户。因此,没有任何 USER windows 帐户可以直接访问数据库,而且您还有一个额外的好处,那就是不必考虑密码。
    • 对,这很有意义。我非常感谢您的回复。我想这还有一个额外的好处,那就是可以更轻松地添加可以访问同一数据库的 MVC Web 应用程序。回顾 Winforms 应用程序,您如何在 Web 服务中为使用其 AD 帐户的用户管理权限?并且,如何跨越到使用 Web 服务帐户访问数据库?
    • 我要留下的评论太长了,所以我更新了答案。
    • 你在这里让我大开眼界,但一切都很合乎逻辑。我现在需要一些时间来消化。非常感谢您抽出宝贵时间回复!
    猜你喜欢
    • 2010-10-22
    • 2012-09-14
    • 1970-01-01
    • 2018-09-03
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多