C# 如何将ASP.NET核心用户机密部署到生产环境中
我在开发过程中遵循了asp.net文档指南,但它没有描述在发布到另一台机器进行QA、生产等时如何使用它。我认为它可以在发布过程中将它们插入appsettings.json,但它没有。最后,我不得不将SendGrid密钥和其他敏感信息直接放入appsettings.json中,这实际上违背了应用程序机密的目的C# 如何将ASP.NET核心用户机密部署到生产环境中,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我在开发过程中遵循了asp.net文档指南,但它没有描述在发布到另一台机器进行QA、生产等时如何使用它。我认为它可以在发布过程中将它们插入appsettings.json,但它没有。最后,我不得不将SendGrid密钥和其他敏感信息直接放入appsettings.json中,这实际上违背了应用程序机密的目的 使用应用程序机密是最好的方法还是有其他方法在我的配置中存储API密钥和SQL用户/密码?不要在生产中使用应用程序机密。曾经正如文章所说,在开发过程中 如何在生产中发布机密取决于您的生产环境。
使用应用程序机密是最好的方法还是有其他方法在我的配置中存储API密钥和SQL用户/密码?不要在生产中使用应用程序机密。曾经正如文章所说,在开发过程中 如何在生产中发布机密取决于您的生产环境。Linux、Windows和Azure都支持环境变量——这就是您的秘密所在,使用托管提供商提供的任何UI “为什么不在生产中使用应用程序机密”将对此进行更详细的讨论。加密的秘密安全吗?对于应用程序配置来说,这是非常可以接受的,例如,您提到的用于密码恢复的SendGrid。服务器中是否存在配置机密?为什么我被禁止?只要把从开发到生产的过程中编译的代码复制下来,它就可以工作了 Startup.cs
public Startup(IConfiguration configuration)
{
Configuration = configuration;
var builder = new ConfigurationBuilder().AddUserSecrets<Startup>();
Konfiguration = builder.Build();
}
public IConfiguration Configuration { get; }
public IConfiguration Konfiguration { get; }
public void ConfigureServices(IServiceCollection services)
....
services.AddSingleton<IEmailSender, EmailSender>();
services.Configure<AuthMessageSenderOptions>(Configuration);
if (Configuration["SendGridKey"] != null)
return;
// linux'e secrets.json nenuskaitomas
services.Configure<AuthMessageSenderOptions>(options => {
options.SendGridKey = Konfiguration["SendGridKey"];
options.SendGridUser = Konfiguration["SendGridUser"];
});
}
公共启动(IConfiguration配置)
{
配置=配置;
var builder=new ConfigurationBuilder().AddUserSecrets();
Konfiguration=builder.Build();
}
公共IConfiguration配置{get;}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
....
services.AddSingleton();
服务。配置我想您应该在第一次运行项目的每台计算机上重新创建它。只有当某个环境变量从链接设置为“开发”时,才会应用用户机密。机密管理器工具不会加密存储的机密,不应将其视为受信任的存储。它仅用于发展目的。这只是为了防止代码中的秘密被提交给您的回购协议。在生产环境中,将秘密值设置为appsettings或env变量或任何其他配置源。我只是不认为用户机密有什么价值,如果最终你不得不公开你为生产而存储它们的价值。如果它只在开发中有用,那么一旦开始生产,hec会做什么?@Sam对于生产,您通常会在构建或发布管道中进行价值替换。在azure devops中,它们有存储生产值的位置,这些值会在管道的发布步骤中得到回复。虽然不如部署配置文件那么简单,但我确实理解为什么您会使用环境变量。环境变量是存储机密的非常差的来源。本地管理员可以访问它们,这对许多环境都是危险的。如果可以使用密钥库,则至少应该以某种方式对机密进行加密。环境变量的安全性并不比将值存储在appsettings.json中更高。有权访问您的文件系统的黑客可以轻松访问这两个系统。那么,将值存储在环境变量中有什么意义呢?欢迎提供指向解决方案的链接,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及为什么存在,然后引用您链接到的页面的最相关部分,以防目标页面不可用。此答案不正确,不应遵循。“只是从开发到生产过程中编译的副本,它就可以工作”真的很危险,应用程序的秘密是不加密的。请再次阅读已接受的答案。这对于回答用户对生产中的加密问题没有任何帮助。这是一个有效点。
private readonly IOptions<AuthMessageSenderOptions> _optionsAccessor;
public HomeController(..., IOptions<AuthMessageSenderOptions> optionsAccessor)
{
...
_optionsAccessor = optionsAccessor;
}
public IActionResult Index(...)
{
if (_optionsAccessor.Value.SendGridUser != null)
ModelState.AddModelError("", _optionsAccessor.Value.SendGridUser);
....