【问题标题】:Where is the best practice for keeping config info in an ASP.NET MVC application?在 ASP.NET MVC 应用程序中保存配置信息的最佳实践在哪里?
【发布时间】:2017-05-13 02:58:54
【问题描述】:

我想知道为以下两个问题保留与以下字段相关的配置信息的一般约定:

A > 安全问题

B > 更新问题(如果配置应该由用户而不是开发人员更新)。

1) 我在web.config 中定义了数据库连接字符串信息(数据库、用户和密码)。还有另一种方法,即保存在cs文件中吗?我认为不可能将它保存在应用程序使用的同一个数据库中。

2) 我的应用程序发送电子邮件,我在电子邮件的 *.cs 类中定义凭据。这是真的吗?通过考虑到此信息已更改并且没有开发人员可以支持,将它们保存在数据库中并允许用户通过应用程序更新它们是个好主意吗?

3) 所有场景(配置、更新和 *.cs 文件)的方法是什么?例如,当将电子邮件凭据保存在数据库中时,我是否应该在使用前从数据库中获取这些信息?或者是否有另一种方法,即将它写入一个临时文件,然后重用它,直到它在数据库中被更改,等等)

任何帮助将不胜感激。

【问题讨论】:

  • 我通常不再在我的应用程序中存储敏感信息,而是现在使用服务为我保留这些信息。在我的情况下,我使用 Azure 的 Key Vault,然后在应用启动时,将设置加载到内存中。
  • @AndrésNava-.NET 感谢您的通知。但我不想使用第 3 方工具或系统,我有 3 个选项:web.config(或其他配置文件)、数据库和 *.cs 文件。对他们有什么想法吗?

标签: c# asp.net-mvc security web-config config


【解决方案1】:

在源代码中保留连接字符串和凭据等信息通常是一种不好的做法。而且它并不比将其存储在 Web.config(未加密)中更安全,因为所有 资源可以简单地从代码中提取。 对于 Web 应用程序,最佳做法是将所有敏感信息存储在一个位置(如 web.config),但在部署期间对其进行加密。

要加密web.config,你可以使用aspnet_regiis 工具,可以在这里找到

%windows%\Microsoft.NET\Framework\versionNumber

例如

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe

使用键 -pef-pe。您可以只加密特定部分,例如 <connectionString>,而其他部分不加密。

更多信息请查看Encrypting and Decrypting Configuration SectionsamdHow to: Encrypt a web.config File

【讨论】:

  • 通常由持续集成服务器(CI)完成。您只需更改 web.config 并提交到存储库 CI 进行加密并部署到 prod。但是,您可以在 prod 服务器上手动执行此操作,方法是解密 web.config、更改它并重新加密。在 CI 之前,我们使用 powershell 脚本来做到这一点。
  • 您可以使用db来存储配置,这通常是正常的,但您可能会在应用程序生命周期中遇到一些困难问题,例如发布和回滚您的更改。
  • 反对数据库的另一个论点是它成为故障点。如果您没有与数据库的连接(已关闭),您更愿意向开发人员发送消息或支持或至少执行不涉及数据库的最小功能。在这种情况下,您将不得不有许多配置存储的地方。在我看来,所有不会动态或由用户更改的配置,都应该保存在web.config 或某个配置文件中。
  • 是的,你可以,但我会在数据库中存储用户的特定设置或可以经常更改的设置,或者您有时更改的设置,并且您不想因为它们而重新部署您的应用程序。用户@user783836 提供了分步指南的良好链接。复制到这里stackoverflow.com/questions/26294226/…
  • 不可能将配置保存到数据库中的数据库中,它必须在 web.config 的connectionstrings 部分。对于smtp 客户端配置,也有一个特殊部分(参见:stackoverflow.com/q/19233108/1437693)。您可以保留在 appSettings 中的其他设置(请参阅:stackoverflow.com/q/8147220/1437693),或者您可以创建自己的类来介绍一个部分(请参阅:stackoverflow.com/q/2155/1437693
【解决方案2】:

加密敏感的应用程序配置数据通常是个好主意。您可以使用多种方法,具体取决于您拥有的应用程序类型。

对于 Web 应用程序,您可以使用 DPAPI 和 aspnet_regiis 来加密配置。示例代码见Encrypt and deploy app.config

或者(如果您有桌面应用程序或不想要 aspnet_regiis)您可以查看受保护的配置部分,如下所述:https://msdn.microsoft.com/en-us/library/hh8x3tas.aspx

回答您的具体问题:

1) 将其保存在 web.config 中并对其进行加密。从安全角度来看,.cs 文件中的硬编码存在缺陷(代码可以反编译),并且随着您的代码从环境移动到环境(dev -> uat -> prod),这将使其难以更改

2) 同样,不要将凭据存储在 .cs 文件中。您可以为用户提供一个 UI 来操作配置,但请记住,他们可能会破坏配置,您需要一种机制来恢复到已知良好的配置

3) 如果您担心从数据库读取的频率(尽管只要没有写入,读取成本很低),您可以在启动时简单地将所有配置读取到一个类中。这样就没有需要管理的临时文件,并且数据库上的读取量是有限的。

【讨论】:

  • 非常感谢您的精彩解释。我有一个 ASP.NET MVC Web 应用程序,需要进一步澄清以下几点... >>>
  • 1) 正如您所建议的,我将通过 aspnet_regiis 对它们进行加密,从而将所有配置信息保存在 web.config 文件中。但是,如果用户需要在配置文件中更改数据库名称或邮件 smtp 地址怎么办?如果这些信息被加密,是否可以更新这些信息? 2) 我正在考虑创建一个用于更新 smtp 邮件设置的页面。那么,您能否发布一个示例来说明:从数据库中检索配置数据并加载到类文件中。那么我如何在邮件发送类中使用它呢? 3) 我应该在保存到数据库之前加密配置数据吗?
  • 如果您有时间,请澄清一下我上面评论中的要点?
  • 1) 通常配置文件不应由应用程序更新。您可以将这些设置移动到数据库 2)我假设您有一些 MVC 类型的框架来生成页面。然后,您可以使用依赖注入来注入您的配置,或者将您的配置作为可以引用的静态类 3) 取决于您的安全要求 - 存储什么以及谁可以访问它。有时我会,有时我不会。
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2020-12-24
相关资源
最近更新 更多