我在开发过程中遵循了Safe storage of app secrets during development指南,但是没有描述如何在发布到另一台QA,Production等机器时使用它。我认为它会做的是插入他们在发布期间进入appsettings.json,但事实并非如此。我最终不得不将我的SendGrid密钥和其他敏感信息直接放入appsettings.json,这实际上违背了应用程序机密的目的。
使用app secret是最好的方法还是在我的配置中有另一种方法来存储API密钥和SQL用户/密码?
答案 0 :(得分:14)
请勿在制作中使用应用机密。永远。正如文章所述,在开发期间。
如何在生产中发布秘密取决于您的生产环境。 Linux,Windows和Azure都支持环境变量 - 这是您的秘密应该去的地方,使用您的托管服务提供商为您提供的任何UI。
app settings documentation更详细地讨论了这个问题
答案 1 :(得分:1)
为什么“在生产中不使用应用程序机密”。加密的机密安全吗?这对于应用程序配置是非常可接受的,例如,您提到的用于密码恢复的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"];
});
}
HomeController.cs
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);
....
继续进行“启用帐户确认和密码恢复” https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-2.1&tabs=visual-studio#configure-email-provider