ASP.NET Core優(yōu)雅的在開發(fā)環(huán)境保存機密(User Secrets)
前言
在應(yīng)用程序開發(fā)的過程中,有的時候需要在代碼中保存一些機密的信息,比如加密密鑰,字符串,或者是用戶名密碼等。通常的做法是保存到一個配置文件中,在以前我們會把他保存到web.config中,但是在ASP.NET Core中,這一方式或許發(fā)生了改變,或者說你有更多多元化的方法, 以及更加優(yōu)雅的的配置來設(shè)置或者保存這些機密資料。
起初我以為這個UserSecrets它并沒有什么用,因為我有需要配置的地方我直接配置到appsetting.json文件中就可以了,直到一次開發(fā)過程中,我才感受到了它真正的用途。
目錄
- 用戶機密介紹
- 如何添加用戶機密
- 在應(yīng)用程序中使用用戶機密
- 總結(jié)
用戶機密介紹
有以下場景大家可以想一下在以前的代碼中我們是怎么樣處理的:
- 需要保存一些和第三方網(wǎng)站對接的密鑰,比如和 微信,微博站點使用的 appkey
- 給每個開發(fā)人員配置不用的用戶名密碼來訪問一些資源
- 開發(fā)人員在開發(fā)過程中使用各自本機的數(shù)據(jù)庫,如何配置數(shù)據(jù)庫地址、賬號和密碼
假設(shè)說最后一項,每個開發(fā)要使用自己本機的數(shù)據(jù)庫,你可能會說讓每個人修改自己的web.config,在提交代碼的時候不提交就行了。那么如果在web.config添加其他配置項的時候,顯然不提交web.config文件不合理的。
現(xiàn)在,ASP.NET Core 提供了一種很優(yōu)雅簡潔的方式 User Secrets 用來幫助我們解決這個事情。
在新建一個 ASP.NET Core Web 應(yīng)用程序的時候,會在 Startup.cs 文件中看到這樣一段代碼:
public Startup(IHostingEnvironment env)
{
.....
if (env.IsDevelopment())
{
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
}
在 project.json 文件中,會看到 User Secrets 相關(guān)的一些配置
{
"userSecretsId": "aspnet-WebAppCore-e278c40f-15bd-4c19-9662-541514f02f3e"
...
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
"Microsoft.Extensions.SecretManager.Tools": “1.0.0-preview2-final”
}
可以看到builder.AddUserSecrets這行代碼,他是在開發(fā)環(huán)境才運行的。
userSecretsId是用來標識項目的User Secrets唯一性的,如果有兩個項目需要使用不同的Secrets ,這就需要有不同的userSecretsId。
Microsoft.Extensions.SecretManager.Tools 主要是用來設(shè)置或者查看secrets的值。
如何添加用戶機密
可以在命令行中使用命令來添加:
image
- 切換命令行窗口到程序的運行目錄, 輸入 dotnet user-secrets -h ,來查看可以使用的命令
- 使用 dotnet user-secrets list 列出所有的用戶機密
- 使用 dotnet user-secrets set WeChatAppKey "X3423FEED2435DD"設(shè)置一個用戶機密,其中 WebChatAppKey 為鍵,后面的是值。
- 然后使用dotnet user-secrets list來查看設(shè)置的鍵值對。
- 然后我又設(shè)置了一個數(shù)據(jù)庫的連接字符串進去。
以上是使用命令行的方式來設(shè)置用戶機密,也可以使用 Visual Studio 2015代替命令行來做這項工作。
Visual Studio中,在Web項目上右鍵,可以看到一個 管理用戶機密 的菜單:
image
點擊打開時候,會出現(xiàn)一個secrets.json的文件,里面就是剛剛在命令行設(shè)置的鍵值對:
image
有些同學可能會問既然是存儲到secrets.json,那么這個文件是在哪里呢?
secrets.json的存儲位置?
在非Windows系統(tǒng)中,它的存儲位置在
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
在Windows系統(tǒng)中,它的位置在
C:\Users\用戶名\AppData\Roaming\Microsoft\UserSecrets\aspnet-WebAppCore-e278c40f-15bd-4c19-9662-541514f02f3e
可以看到,存儲的上層文件夾就是project.json文件中的 userSecretsId 設(shè)定的值。
在應(yīng)用程序中使用用戶機密
要在應(yīng)用程序中訪問配置的用戶機密,你需要保證project.json文件中存在依賴項:
Microsoft.Extensions.Configuration.UserSecrets 并且builder.AddUserSecrets()。
然后在Startup.cs文件中通過 Configuration 對象訪問
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var wechatKey = Configuration["WeChatAppKey"]
}
你可以使用DI來將用戶機密映射到一個C#類文件,像這樣
secrets.json
{
"SecretsKeys":
{
WeCharAppKey:"xxejfwert3045",
WeboAppKey:"35402345lkefgjlkdfg",
.....
}
}
SecretsKeysConfig.cs
public class SecretsKeysConfig
{
public string WeCharAppKey { get; set;}
public string WeboAppKey { get; set;}
// ......
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<SecretsKeysConfig>(Configuration.GetSection("SecretsKeys"));
// 其他代碼
}
HomeController.cs
public class HomeController : Controller
{
public SecretsKeysConfig AppConfigs { get; }
public HomeController(IOptions<SecretsKeysConfig> appkeys)
{
AppConfigs = appkeys.Value;
}
}
注意:如果你的appsetting.json文件中有和secrets.json文件中相同節(jié)點(沖突)的配置項,那么就會被secrets.json中的設(shè)置項給覆蓋掉,因為 builder.AddUserSecrets()晚于 AddJsonFile("appsettings.json")注冊, 那么我們可以利用這個特性來在每個開發(fā)人員的機器上重新設(shè)置數(shù)據(jù)庫連接字符串了。
總結(jié)
以上,或許可以感受到微軟在 ASP.NET Core 中對于開發(fā)人員還是非常貼心的,很多小細節(jié)都考慮到了,因此在我們構(gòu)建應(yīng)用程序的過程中,可以多使用這些小功能(特性)來讓我們的代碼更加的優(yōu)雅~
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- .Net Core3 用Windows 桌面應(yīng)用開發(fā)Asp.Net Core網(wǎng)站
- ASP.NET Core應(yīng)用錯誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者異常頁面”
- Asp.Net Core利用文件監(jiān)視進行快速測試開發(fā)詳解
- ASP.NET Core開發(fā)教程之Logging利用NLog寫日志文件
- Visual Studio 2017 ASP.NET Core開發(fā)
- VS2015 搭建Asp.net core開發(fā)環(huán)境的方法
- [Asp.Net Core]提高開發(fā)效率的方法
相關(guān)文章
菜渣開源一個基于?EMIT?的?AOP?庫(.NET?Core)的方法
CZGL.AOP?是?基于?EMIT?編寫的?一個簡單輕量的AOP框架,支持非侵入式代理,支持.NET?Core/ASP.NET?Core,以及支持多種依賴注入框架,本文介紹菜渣開源一個基于?EMIT?的?AOP?庫(.NET?Core)的相關(guān)知識,感興趣的朋友一起看看吧2024-06-06
Repeater控件與PagedDataSource結(jié)合實現(xiàn)分頁功能
Repeater控件與PagedDataSource相結(jié)合實現(xiàn)其分頁功能,如果控件開發(fā)人員需對自定義數(shù)據(jù)綁定控件提供分頁支持,即可使用此類2014-01-01
.NET Core創(chuàng)建一個控制臺(Console)程序
這篇文章主要為大家詳細介紹了.NET Core如何創(chuàng)建一個控制臺程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
.NET 6開發(fā)TodoList應(yīng)用實現(xiàn)結(jié)構(gòu)搭建
這篇文章主要介紹了.NET 6開發(fā)TodoList應(yīng)用實現(xiàn)結(jié)構(gòu)搭建,上一篇我們講解了實現(xiàn)系列背景 ,今天繼續(xù)來講講.NET 6開發(fā)TodoList并且實現(xiàn)結(jié)構(gòu)搭建,更多詳細內(nèi)容剛興趣得小伙伴可以來參考一下下面文章得具體內(nèi)容2021-12-12

