在ASP.NET和Azure的配置中,对于私有配置数据和连接字段的最好的练习
【原文发表地址】Best practices for private config data and connection strings in configuration in ASP.NET and Azure
【原文发表时间】January 6, '16
一个读者发邮件来询问,一般情况下如何避免意外地检查密码和其他敏感数据进入GitHub或者源码控制。我认为,公平地说,我们都是做过一两次。因为,这是新老开发人员的成人礼。
没开玩笑, 避免检查密码或/和连接字段进入源码控制的最简单的方式就是别让你的源码中出现密码和链接字段。
听起来很谦逊或者说很滑稽,然而并没有,这是真的。你不能检查一个盘里不存在的东西。
也就是说,有时候你只需要把一个文件标注为“ignored”,意味着不在源码控制之下。对于一些涉及到外部配置的系统,看重的可能是带有一堆非敏感配置数据的共享文件.
ASP.NET 4.6 的秘密和连接字符串
先搞清楚,怎么个秘密法是由你决定的。如果确实是密码级的秘密或是像私钥一类的东西。你应该去看一下data protection systems or a Key Vault like Azure Key Vault.我们在这讨论的是关于带有API键的第三方web API中型企业影响的web 应用程序和可以存在于短期接单的连接字段。学聪明点。
ASP.NET 4.6 有像这种名称/值对应的web.XML配置文件:
<appSettings>
<add key="name"value="someValue"/>
<add key="name"value="someSECRETValue"/>
</appSettings>
我们不想要秘密在那出现! 相反,把他们移出去像这样:
<appSettings file="Web.SECRETS.config">
<add key="name"value="someValue"/>
</appSettings>
然后你只要把另一个的appSetting块放到web.secrets.config 文件中他会在运行期间合并
注意:值得指出的是,appSetting技术同样对带有app.config的控制台应用程序适用。
最后,确保添加Web.secrets.config(或者, 最好是,使他成*.secrets这样,并且用一个唯一的扩展名去确认你的敏感配置).
这种外部配置同样适用于<connectionString>块,除非你用了像这样的configSource属性:
<connectionStringsconfigSource="secretConnectionStrings.config">
</connectionStrings>
Azure中连接字符串和App的秘密
当你将一个web应用程序部署到Azure时(通常这些应用程序是从源代码/GitHub等地方部署的)你绝不能把连接字符串或者应用程序设置放到Web.config文件或者硬编码在文件中.
相反,在Azure中应该经常使用Web应用程序的应用程序设置配置部分。
这些集合的字符串和键值对将会自动透明地提供给你的网站,这样你就不需要更改任何Asp.net的代码。考虑到他们有比web.config更窄的范围,并且系统会自动合并设置。
除此之外,他们将变量视为环境变量,所以你同样可以通过Environment.GetEnvironmentVariable(“APP SETTING_你的值”)来获取。这在任何网页框架中都可以运行,不仅仅是ASP.NET,所以在php中你只需要按照你喜欢的方式getenv(‘APPSETTING_你的值’)来获值。
用于环境变量的数据库连接字符串类型和前缀字符串的全部列表如下:
· 如果你选择”Sql Databases”,前缀字符串是“SQLAZURECONNSTR_”
· 如果你选的是“SQL Server”, 前缀字符串是“SQLCONNSTR_”
· 如果你选择的是“MySQL”, 前缀字符串是
“MYSQLCONNSTR_”
· 如果你选择的是“Custom”, 前缀字符串是
“string is “CUSTOMCONNSTR_”
ASP.NET 5
AP.NET 5有关于用户或用户级机密的概念,在这里键/值对确实存在一个文件中,但是该文件不在你的项目文件夹中,它存储在你的计算机操作系统的用户配置文件中。这样一来,这些配置就没有机会被放入源代码管理器中。还有一个机密管理器(它还在测试版本,所以对它的改变也是期望的)在这里你可以名称/值对.
ASP.NET代码中也有非常灵活的范围规则。你可以有一个appSettings,一个特定于环境(开发,测试,暂存,生产)的appSetings,还有用户的机密信息, 当然还有环境变量。所有的一切都是通过代码配置的,正如我提及的,也是非常灵活。如果你不喜欢,你可以更改它.
var builder = newConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if(env.IsDevelopment())
{
// For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
因此结论如下:
· 别把隐私信息放在代码中
o 看起来很明显,但是…
· 避免把隐私信息放在公用的配置文件中.
o 外部化他们并忽略外部话文件,这样它们就不会检入。
· 请考虑使用环境变量或用户级别的配置选项.
o 在开发中将敏感配置从你的项目文件夹中拿出来
我确信我漏掉了一些事情. 你的小窍门是什么呢, 亲爱的读者?
资源
· 将密码和其他敏感数部署到ASP.NET和Azure应用程序上的最佳做法.
Image Copyright Shea Parikh - used under license from https://getcolorstock.com