ASP.NET Core连接到SQL Server的最佳实践是什么?

7

我最近遇到了一些SQL Server不支持默认AppIdentityUser登录的问题,所以我创建了一个具有写入访问权限的自定义DB用户。

但是这让我想知道——这是最好的方法吗?

我在想Asp.Net Core的最佳SQL Server登录方法是什么。我知道有一个类似于.NET的普通问题,但您无法快速而简单地加密Core web.config/appsettings.json。

以下是我认为的选项:

通过存储在appsettings.json中的SQL Server ID连接。

  • 优点:已经配置完成。
  • 缺点:密码在web.config/appsettings.json中;必须专门配置SQL Server ID。不能够进行集中撤销。

通过ASP.NET“AppIdentityUser”连接到用户NT ID。

  • 优点:appsettings.json中没有密码。
  • 缺点:不能够进行集中撤销。似乎受限于用户的服务器名称。

通过Active Directory用户连接。

  • 优点:可轻松撤销。
  • 缺点:appsettings.json中的Active Directory用户密码。如果某人意外地在公司的另一个应用程序中重新使用该用户并且该用户被攻击,则可能会产生问题。

还有其他我可能错过的选项吗?在哪些情况下使用这些选项?哪些是更标准的?有没有我没有考虑到的优缺点?


我发现这个链接对我很有帮助。希望它也能在你的情况下有所帮助... https://learn.microsoft.com/en-us/aspnet/identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azure - Kalyan
1
我们这里的做法是,为您的应用程序始终设置一个单独的用户。这样可以给数据库管理员更精细的访问权限,以便他们可以为您进行管理。也可以将用户分配到一个组中等等。关于用户,在 aspnet core 中,您可以在 app.config 中进行配置...而对于生产环境,您可以设置环境变量。这样就不会将生产密码存储在源代码控制中了。更加安全。 - jpgrassi
1个回答

5

您应该绝对使用自定义 SQL 登录来连接数据库。在幕后,SQL 登录可以与本地帐户、服务帐户、网络帐户等相关联。实际上这并不重要。

您似乎真正遇到的问题是不想(正确地)以明文方式公开登录凭据。我不确定为什么您一直在提 Web.config,在 ASP.NET Core 中并不使用它。相反,有各种配置提供程序可供选择使用。默认情况下,ASP.NET Core(至少从2.0开始)添加了一个 JSON 配置提供程序,用于查找项目中的 appsettings.jsonappsettings.{environment}.json 文件,命令行配置提供程序,用户密码配置提供程序和最后是环境变量配置提供程序。

后面两个选项是您情况下最有趣的。在开发过程中,您应该使用用户密码。在生产中,您应该使用环境变量。但是,两者都没有以加密方式存储密码。任何一种方法的好处是密码不在您的项目中,因此也不在您的源代码控制中。即使两者都没有加密,这并不像您可能认为的那样令人担忧。获取其中任何一个秘密都需要直接访问服务器/开发机器。此外,默认情况下,用户密码与特定用户帐户相关联,只能由该用户访问,环境变量也可以以同样的方式设置。因此,某人需要同时获得对机器和特定帐户的访问权限。那实际上是一个很高的限制条件,如果发生这种情况,在此时公开数据库密码真的不是您最担心的问题。

但是,如果您想要真正的加密,可以选择使用 Azure KeyVault。KeyVault 可以在您的应用程序实际托管在 Azure 中与否的情况下使用,虽然它不是免费的,但它非常便宜。

最后,您始终可以创建自己的配置提供程序或使用第三方提供程序。例如,虽然默认的 JSON 提供程序不支持加密,但您可能可以编写一个支持加密的提供程序。


1
你提出了一些很好的观点。我对Core比Standard .NET的少数几件事之一感到厌恶的是无法轻松加密文件(例如web.config)。然而,我想知道,使用“Server = someserver; Database = someDB; Integrated Security = True”的连接字符串是否比在连接字符串中具有用户名/密码更好?这似乎减少了一个攻击向量-因为访问数据库的用户将是服务器名称(例如someserver),并且该密码不会在repo中。 - Ryan Battistone
3
不使用集成安全的最大原因可能是Web服务器和数据库服务器必须成为域的一部分,而使用SQL登录,则可以将它们放在DMZ中,远离内部网络。大多数IT专业人员都会建议不要将任何内部网络暴露给外部世界。虽然通过正确的防火墙配置仍然可以保护安全性,但这只是又多了一个需要担心的事情,最终仍然提供了攻击向量,而您本来不必担心这个问题。 - Chris Pratt
这非常有道理。谢谢 Chris! - Ryan Battistone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接