从 ASP.NET 核心连接到 SQL 服务器的最佳实践?
Best practices for connecting from ASP.NET Core to SQL Server?
我最近遇到了一些问题 SQL 服务器不喜欢登录的默认 AppIdentityUser,所以我继续创建了一个具有写入权限的自定义数据库用户。
但这让我想知道 - 这是最好的方法吗?
我想知道 Asp.Net Core 最好的 SQL 服务器登录方法是什么。我知道对于普通 .NET 有一个与此类似的问题,但您无法加密 Core web。config/appsettings.json(好吧,以一种快速而直接的方式)。
以下是我看到的选项:
通过存储在 appsettings.json 中的 SQL 服务器 ID 连接。
- 专业版:已配置。
- 缺点:web 中的密码。config/appsettings。json;必须专门配置 SQL 服务器 ID。不可集中撤销。
通过 ASP.NET "AppIdentityUser".
通过用户 NT ID 连接
- 专业版:appsettings.json 中没有密码。
- 缺点:不可集中撤销。似乎仅限于用户的服务器名称。
通过 Active Directory 用户连接。
- 专业版:可轻松撤销。
- 缺点:appsettings.json 中的 Active Directory 用户密码。如果有人不小心在公司的另一个应用程序中重复使用该用户,并且该用户被破坏,则可能会很糟糕。
我还缺少其他选项吗?在哪些情况下使用这些选项中的哪些?哪些比较标准?有没有我没有考虑的利弊?
您绝对应该使用自定义 SQL 登录名来连接数据库。在幕后,SQL 登录可以绑定到本地帐户、服务帐户、网络帐户等。这实际上并不重要。
您在这里遇到的真正问题似乎是不想(正确地)以纯文本形式公开登录凭据。我不确定您为什么在这里一直提到 Web.config,因为 ASP.NET Core 不使用它。相反,可以选择使用各种配置提供程序。默认情况下,ASP.NET Core(至少从 2.0 开始)添加了一个 JSON 配置提供程序,它在您的项目中查找 appsettings.json
和 appsettings.{environment}.json
,一个 command-line 配置提供程序,用户机密配置提供程序,最后是环境变量配置提供程序。
对于您的情况,最后两个是最有趣的。在开发中,您应该使用用户机密。在生产中,您应该使用环境变量。但是,两者都没有以加密方式存储秘密。这两种方法的好处是秘密不在您的项目中,因此也不在您的源代码管理中。尽管两者都没有加密,但它并不像您想象的那么重要。要了解其中任何一个的秘密,都需要直接访问 server/development 机器。此外,用户机密默认绑定到特定用户帐户,只能由该用户访问,并且可以以相同方式设置环境变量。因此,某人需要同时获得对机器的访问权限 和 获得对特定帐户的访问权限。这实际上是一个相当高的门槛,如果真的发生了,那么此时暴露数据库密码确实是您最不关心的事情。
不过,如果您想要真正的加密,您可以选择使用 Azure KeyVault。无论您的应用程序是否实际托管在 Azure 中,都可以使用 KeyVault,虽然它不是免费的,但非常便宜。
最后,您始终可以创建自己的配置提供程序或源 third-party 配置提供程序。例如,虽然默认 JSON 提供程序不支持加密,但您可以编写一个支持的提供程序。
我最近遇到了一些问题 SQL 服务器不喜欢登录的默认 AppIdentityUser,所以我继续创建了一个具有写入权限的自定义数据库用户。
但这让我想知道 - 这是最好的方法吗?
我想知道 Asp.Net Core 最好的 SQL 服务器登录方法是什么。我知道对于普通 .NET 有一个与此类似的问题,但您无法加密 Core web。config/appsettings.json(好吧,以一种快速而直接的方式)。
以下是我看到的选项:
通过存储在 appsettings.json 中的 SQL 服务器 ID 连接。
- 专业版:已配置。
- 缺点:web 中的密码。config/appsettings。json;必须专门配置 SQL 服务器 ID。不可集中撤销。
通过 ASP.NET "AppIdentityUser".
通过用户 NT ID 连接- 专业版:appsettings.json 中没有密码。
- 缺点:不可集中撤销。似乎仅限于用户的服务器名称。
通过 Active Directory 用户连接。
- 专业版:可轻松撤销。
- 缺点:appsettings.json 中的 Active Directory 用户密码。如果有人不小心在公司的另一个应用程序中重复使用该用户,并且该用户被破坏,则可能会很糟糕。
我还缺少其他选项吗?在哪些情况下使用这些选项中的哪些?哪些比较标准?有没有我没有考虑的利弊?
您绝对应该使用自定义 SQL 登录名来连接数据库。在幕后,SQL 登录可以绑定到本地帐户、服务帐户、网络帐户等。这实际上并不重要。
您在这里遇到的真正问题似乎是不想(正确地)以纯文本形式公开登录凭据。我不确定您为什么在这里一直提到 Web.config,因为 ASP.NET Core 不使用它。相反,可以选择使用各种配置提供程序。默认情况下,ASP.NET Core(至少从 2.0 开始)添加了一个 JSON 配置提供程序,它在您的项目中查找 appsettings.json
和 appsettings.{environment}.json
,一个 command-line 配置提供程序,用户机密配置提供程序,最后是环境变量配置提供程序。
对于您的情况,最后两个是最有趣的。在开发中,您应该使用用户机密。在生产中,您应该使用环境变量。但是,两者都没有以加密方式存储秘密。这两种方法的好处是秘密不在您的项目中,因此也不在您的源代码管理中。尽管两者都没有加密,但它并不像您想象的那么重要。要了解其中任何一个的秘密,都需要直接访问 server/development 机器。此外,用户机密默认绑定到特定用户帐户,只能由该用户访问,并且可以以相同方式设置环境变量。因此,某人需要同时获得对机器的访问权限 和 获得对特定帐户的访问权限。这实际上是一个相当高的门槛,如果真的发生了,那么此时暴露数据库密码确实是您最不关心的事情。
不过,如果您想要真正的加密,您可以选择使用 Azure KeyVault。无论您的应用程序是否实际托管在 Azure 中,都可以使用 KeyVault,虽然它不是免费的,但非常便宜。
最后,您始终可以创建自己的配置提供程序或源 third-party 配置提供程序。例如,虽然默认 JSON 提供程序不支持加密,但您可以编写一个支持的提供程序。