ASP.NET Core優(yōu)雅的在開(kāi)發(fā)環(huán)境保存機(jī)密(User Secrets)
前言
在應(yīng)用程序開(kāi)發(fā)的過(guò)程中,有的時(shí)候需要在代碼中保存一些機(jī)密的信息,比如加密密鑰,字符串,或者是用戶名密碼等。通常的做法是保存到一個(gè)配置文件中,在以前我們會(huì)把他保存到web.config中,但是在ASP.NET Core中,這一方式或許發(fā)生了改變,或者說(shuō)你有更多多元化的方法, 以及更加優(yōu)雅的的配置來(lái)設(shè)置或者保存這些機(jī)密資料。
起初我以為這個(gè)UserSecrets它并沒(méi)有什么用,因?yàn)槲矣行枰渲玫牡胤轿抑苯优渲玫?span style="color: #800000">appsetting.json文件中就可以了,直到一次開(kāi)發(fā)過(guò)程中,我才感受到了它真正的用途。
目錄
- 用戶機(jī)密介紹
- 如何添加用戶機(jī)密
- 在應(yīng)用程序中使用用戶機(jī)密
- 總結(jié)
用戶機(jī)密介紹
有以下場(chǎng)景大家可以想一下在以前的代碼中我們是怎么樣處理的:
- 需要保存一些和第三方網(wǎng)站對(duì)接的密鑰,比如和 微信,微博站點(diǎn)使用的 appkey
- 給每個(gè)開(kāi)發(fā)人員配置不用的用戶名密碼來(lái)訪問(wèn)一些資源
- 開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中使用各自本機(jī)的數(shù)據(jù)庫(kù),如何配置數(shù)據(jù)庫(kù)地址、賬號(hào)和密碼
假設(shè)說(shuō)最后一項(xiàng),每個(gè)開(kāi)發(fā)要使用自己本機(jī)的數(shù)據(jù)庫(kù),你可能會(huì)說(shuō)讓每個(gè)人修改自己的web.config,在提交代碼的時(shí)候不提交就行了。那么如果在web.config添加其他配置項(xiàng)的時(shí)候,顯然不提交web.config文件不合理的。
現(xiàn)在,ASP.NET Core 提供了一種很優(yōu)雅簡(jiǎn)潔的方式 User Secrets 用來(lái)幫助我們解決這個(gè)事情。
在新建一個(gè) ASP.NET Core Web 應(yīng)用程序的時(shí)候,會(huì)在 Startup.cs 文件中看到這樣一段代碼:
public Startup(IHostingEnvironment env)
{
.....
if (env.IsDevelopment())
{
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
}
在 project.json 文件中,會(huì)看到 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這行代碼,他是在開(kāi)發(fā)環(huán)境才運(yùn)行的。
userSecretsId是用來(lái)標(biāo)識(shí)項(xiàng)目的User Secrets唯一性的,如果有兩個(gè)項(xiàng)目需要使用不同的Secrets ,這就需要有不同的userSecretsId。
Microsoft.Extensions.SecretManager.Tools 主要是用來(lái)設(shè)置或者查看secrets的值。
如何添加用戶機(jī)密
可以在命令行中使用命令來(lái)添加:
image
- 切換命令行窗口到程序的運(yùn)行目錄, 輸入 dotnet user-secrets -h ,來(lái)查看可以使用的命令
- 使用 dotnet user-secrets list 列出所有的用戶機(jī)密
- 使用 dotnet user-secrets set WeChatAppKey "X3423FEED2435DD"設(shè)置一個(gè)用戶機(jī)密,其中 WebChatAppKey 為鍵,后面的是值。
- 然后使用dotnet user-secrets list來(lái)查看設(shè)置的鍵值對(duì)。
- 然后我又設(shè)置了一個(gè)數(shù)據(jù)庫(kù)的連接字符串進(jìn)去。
以上是使用命令行的方式來(lái)設(shè)置用戶機(jī)密,也可以使用 Visual Studio 2015代替命令行來(lái)做這項(xiàng)工作。
Visual Studio中,在Web項(xiàng)目上右鍵,可以看到一個(gè) 管理用戶機(jī)密 的菜單:
image
點(diǎn)擊打開(kāi)時(shí)候,會(huì)出現(xiàn)一個(gè)secrets.json的文件,里面就是剛剛在命令行設(shè)置的鍵值對(duì):
image
有些同學(xué)可能會(huì)問(wèn)既然是存儲(chǔ)到secrets.json,那么這個(gè)文件是在哪里呢?
secrets.json的存儲(chǔ)位置?
在非Windows系統(tǒng)中,它的存儲(chǔ)位置在
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
在Windows系統(tǒng)中,它的位置在
C:\Users\用戶名\AppData\Roaming\Microsoft\UserSecrets\aspnet-WebAppCore-e278c40f-15bd-4c19-9662-541514f02f3e
可以看到,存儲(chǔ)的上層文件夾就是project.json文件中的 userSecretsId 設(shè)定的值。
在應(yīng)用程序中使用用戶機(jī)密
要在應(yīng)用程序中訪問(wèn)配置的用戶機(jī)密,你需要保證project.json文件中存在依賴項(xiàng):
Microsoft.Extensions.Configuration.UserSecrets 并且builder.AddUserSecrets()。
然后在Startup.cs文件中通過(guò) Configuration 對(duì)象訪問(wèn)
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var wechatKey = Configuration["WeChatAppKey"]
}
你可以使用DI來(lái)將用戶機(jī)密映射到一個(gè)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é)點(diǎn)(沖突)的配置項(xiàng),那么就會(huì)被secrets.json中的設(shè)置項(xiàng)給覆蓋掉,因?yàn)?builder.AddUserSecrets()晚于 AddJsonFile("appsettings.json")注冊(cè), 那么我們可以利用這個(gè)特性來(lái)在每個(gè)開(kāi)發(fā)人員的機(jī)器上重新設(shè)置數(shù)據(jù)庫(kù)連接字符串了。
總結(jié)
以上,或許可以感受到微軟在 ASP.NET Core 中對(duì)于開(kāi)發(fā)人員還是非常貼心的,很多小細(xì)節(jié)都考慮到了,因此在我們構(gòu)建應(yīng)用程序的過(guò)程中,可以多使用這些小功能(特性)來(lái)讓我們的代碼更加的優(yōu)雅~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .Net Core3 用Windows 桌面應(yīng)用開(kāi)發(fā)Asp.Net Core網(wǎng)站
- ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開(kāi)發(fā)者異常頁(yè)面”
- Asp.Net Core利用文件監(jiān)視進(jìn)行快速測(cè)試開(kāi)發(fā)詳解
- ASP.NET Core開(kāi)發(fā)教程之Logging利用NLog寫日志文件
- Visual Studio 2017 ASP.NET Core開(kāi)發(fā)
- VS2015 搭建Asp.net core開(kāi)發(fā)環(huán)境的方法
- [Asp.Net Core]提高開(kāi)發(fā)效率的方法
相關(guān)文章
ASP.NET框架中的數(shù)據(jù)綁定概要與數(shù)據(jù)綁定表達(dá)式的使用
數(shù)據(jù)綁定是ASP.NET中操作數(shù)據(jù)的基礎(chǔ)方式,這里我們暫時(shí)拋開(kāi).NET提供的控件,來(lái)從基礎(chǔ)上講解ASP.NET框架中的數(shù)據(jù)綁定概要與數(shù)據(jù)綁定表達(dá)式的使用:2016-06-06
ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車
這篇文章介紹了ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
.Net連接Oracle數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
本文使用System.Data.OracleClient方式,這是MS提供的以ADO.NET方式訪問(wèn)Oracel的驅(qū)動(dòng);Oracle也有個(gè)Oracle Data Provider for .NET(ODP.NET)下篇再討論。2009-02-02
基于localStorge開(kāi)發(fā)登錄模塊的記住密碼與自動(dòng)登錄實(shí)例
下面小編就為大家?guī)?lái)一篇基于localStorge開(kāi)發(fā)登錄模塊的記住密碼與自動(dòng)登錄實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
asp.net SqlHelper數(shù)據(jù)訪問(wèn)層的使用
如果不使用數(shù)據(jù)訪問(wèn)層,那么你的代碼里會(huì)出現(xiàn)很多SqlConnection、SqlCommand、SqlDataReader、Open、 Close……這些類和方法,而且代碼量很大,讓你不勝其煩,而且代碼寫起來(lái),其實(shí)都是體力活,沒(méi)有技術(shù)含量。2008-09-09
.NET 與樹(shù)莓派WS28XX 燈帶的顏色漸變動(dòng)畫(huà)效果的實(shí)現(xiàn)
所謂顏色漸變動(dòng)畫(huà),首先,你要確定兩種顏色——起始色和最終色,比如從綠色變成紅色,綠色是起始,紅色是終點(diǎn)。這篇文章主要介紹了.NET 與樹(shù)莓派WS28XX 燈帶的顏色漸變動(dòng)畫(huà),需要的朋友可以參考下2021-12-12
asp net core 2.1中如何使用jwt(從原理到精通)
這篇文章主要給大家介紹了關(guān)于asp net core 2.1中如何使用jwt(從原理到精通)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11
分享AjaxPro或者Ajax實(shí)現(xiàn)機(jī)制
今天與大家分享AjaxPro或者Ajax實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下。2011-12-12

