从 ASP.NET Core 连接到 SQL Server 的最佳实践?
Posted
技术标签:
【中文标题】从 ASP.NET Core 连接到 SQL Server 的最佳实践?【英文标题】:Best practices for connecting from ASP.NET Core to SQL Server? 【发布时间】:2018-07-26 18:59:01 【问题描述】:我最近遇到了一些困难,因为 SQL Server 不喜欢默认的 AppIdentityUser 进行登录,所以我继续创建了一个具有写入权限的自定义 DB 用户。
但这让我想知道 - 这是最好的方法吗?
我想知道对于 Asp.Net Core 最好的 SQL Server 登录方法是什么。我知道对于普通的 .NET 有一个类似的问题,但你不能加密核心 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 用户密码。如果有人不小心在公司的另一个应用程序中重用了该用户,并且该用户遭到破坏,那可能会很糟糕。我还缺少其他选项吗?在哪些情况下使用这些选项中的哪一个?哪个更标准?有没有我没有考虑到的优点和缺点?
【问题讨论】:
我发现这个链接对我很有帮助。希望这对您的情况也有帮助...docs.microsoft.com/en-us/aspnet/identity/overview/features-api/… 我们在这里所做的,总是为您的应用程序提供一个单独的用户。这为 dba 提供了更精细的访问权限,因此他们可以为您进行管理。也许将用户分配到一个组等等。关于用户,在 aspnet 核心中,您可以在 app.config.. 中进行配置,而对于生产环境,您可以设置环境变量。这样您就不会将生产密码存储在源代码管理中。更安全。 【参考方案1】:您绝对应该使用自定义 SQL 登录来连接到数据库。在后台,SQL 登录可以绑定到本地帐户、服务帐户、网络帐户等。这实际上并不重要。
您似乎在这里遇到的真正问题是不想(正确地)以纯文本形式公开登录凭据。我不确定你为什么在这里一直提到 Web.config,因为 ASP.NET Core 不使用它。相反,可以选择使用各种配置提供程序。默认情况下,ASP.NET Core(至少从 2.0 起)添加了一个 JSON 配置提供程序,用于在您的项目中查找 appsettings.json
和 appsettings.environment.json
、一个命令行配置提供程序、一个用户机密配置提供程序,最后是一个环境变量配置提供程序。
根据您的情况,最后两个是最有趣的。在开发中,您应该使用用户机密。在生产中,您应该使用环境变量。但是,两者都没有以加密方式存储秘密。任何一种方法的好处是机密不在您的项目中,因此也不在您的源代码控制中。尽管两者都没有加密,但它并不像您想象的那么大。获取其中任何一个的秘密都需要直接访问服务器/开发机器。此外,默认情况下,用户机密与特定用户帐户相关联,只能由该用户访问,并且可以以相同的方式设置环境变量。因此,有人需要同时获得对机器的访问权限和获得对特定帐户的访问权限。这实际上是一个相当高的标准,如果发生这种情况,那么暴露数据库密码确实是您最不关心的问题。
不过,如果您想要真正的加密,您可以选择使用 Azure KeyVault。无论您的应用程序是否实际托管在 Azure 中,都可以使用 KeyVault,虽然它不是免费的,但非常便宜。
最后,您始终可以创建自己的配置提供程序或获取第三方的来源。例如,虽然默认 JSON 提供程序不支持加密,但您可以编写一个支持加密的提供程序。
【讨论】:
你提出了一些优秀的观点。我讨厌 Core over Standard .NET 的少数几件事之一是无法轻松加密文件(例如 web.config)。但是,我确实想知道,与“Server=someserver;Database=someDB;Integrated Security=True”的连接字符串不是比在连接字符串中包含用户名/密码更好的方法吗?似乎它减少了一种攻击向量 - 因为访问数据库的用户将是任何服务器名称(例如 someserver),并且该密码不会在 repo 中。 嗯,不使用集成安全性的最大原因可能是 Web 服务器和数据库服务器必须是域的一部分,而使用 SQL 登录,您可以将它们放在 DMZ 中锁定在您的内部网络之外。大多数 IT 专业人员会建议不要将内部网络的任何部分暴露给外界。它可以通过适当的防火墙配置仍然是安全的,但这只是需要担心的另一件事,并且最终仍然提供了一个攻击媒介,否则您不必担心。 这很有意义。谢谢克里斯!以上是关于从 ASP.NET Core 连接到 SQL Server 的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mac 上将 ASP.Net Core 连接到 SQL Server Docker 容器
使用新的 ASP.NET Core 应用程序连接到 SQL Server 时出现问题
如何使用 asp net core 2 连接到 SQL Server 2008?
ASP.NET Core MVC:使用 SQL Server 身份验证连接到现有数据库
如何在不使用 EF 的情况下连接到 ASP.NET Core Web API 中的数据库?
如何从 asp.net core webapi 获取数据到连接到数据库的 angular 11.0.0。我试图这样做,但它返回空记录