为什么只在开发环境中使用用户机密?

时间:2019-06-17 07:10:01

标签: c# asp.net-core .net-core

我必须将密钥保存到项目和存储库之外。为此,我想使用User secrets。但这是写在这里,

  

仅当应用程序在开发环境中运行时才调用AddUserSecrets,如以下示例所示

我无法理解或找到原因。为什么我不能在生产环境中使用它?

4 个答案:

答案 0 :(得分:3)

您可以在提供给“用户秘密”文档的链接中找到它:

  

Secret Manager工具不会加密存储的机密,并且   不应被视为受信任的商店。这是为了发展   只要。键和值存储在JSON配置文件中   用户个人资料目录。

答案 1 :(得分:1)

用户机密基本上是用户目录中某个地方的JSOn文件。这在您的开发PC上效果很好。但是在生产系统上,通常应通过更多可用于生产的配置系统(例如Environment Variablesappsettings.jsonazure keyvault)注入值。默认情况下,Envsappsettings已被激活。

答案 2 :(得分:1)

我认为简短的答案是,如果您愿意的话,您可能会这样做,但这不是它的初衷。

我的理解是用户机密的主要目的是使凭据不受源代码控制。在GitHub和云发布之前的几天里,大多数开发人员只是将所有凭据都保留在web.config中,并且大多数情况下都可以。然后,许多人开始使用公共存储库和AWS,突然之间https://www.zdnet.com/article/trufflehog-high-entropy-key-hunter-released-to-the-masses/

现在有许多用于管理机密的工具,最适合您需要的是一个很难解决的问题,但是您可以考虑:

  • 您是否正在使用访问控制的源代码控制?
  • 您要在云还是本地进行构建和部署?
  • 谁拥有对实时服务器的读取权限?
  • 您存储的数据有多敏感?
  • 服务器上还运行哪些其他应用程序?

我只是在CreateDefaultBuilder方法中闲逛,发现了这一点,这可能是相关的:

if (hostingEnvironment.IsDevelopment())
{
    Assembly assembly = Assembly.Load(new 
              AssemblyName(hostingEnvironment.ApplicationName));

    if (assembly != (Assembly) null)
          config.AddUserSecrets(assembly, true);
 }

很显然,您不必使用默认版本,并且可以为所有环境添加机密,但是确实存在。

答案 3 :(得分:1)

这是仅开发时间的工具。将任何类型的机密存储在文件中都是有风险的,因为您可能会意外地将其检入。在生产中,例如,您可以使用环境变量来保存机密(或任何其他更安全的机制。)

虽然环境变量是Web开发中最常用的选项之一,但出于某些原因,这可能不是最佳方法:

1。该环境隐式可用于该进程,并且很难跟踪访问。因此,例如,您可能会遇到错误报告中包含机密的情况

2。整个环境向下传递到子进程(如果未明确过滤)。因此,您的秘密密钥将隐式地提供给可能使用的任何第三方工具。

所有这些都是如今Vault之类的产品变得流行的原因之一。

因此,您可以使用环境变量,但要注意。