如何在 Asp.Net Core 中 管理敏感數(shù)據(jù)
譯文鏈接:https://www.infoworld.com/article/3576292/how-to-work-with-user-secrets-in-asp-net-core.html
在應(yīng)用程序開(kāi)發(fā)時(shí),你肯定會(huì)有一些特別需要保護(hù)的數(shù)據(jù),這些數(shù)據(jù)通常是非常機(jī)密的,敏感的,禁止和別人共享,這些信息包括:數(shù)據(jù)庫(kù)連接串,你懂的,畢竟里面有 userid 和 password,還有 OAuth 驗(yàn)證用到的 accesskey,apikey 或者配置 azure,aws 等云服務(wù)的連接信息。
當(dāng)項(xiàng)目和別人共享的時(shí)候,這些敏感信息自然也暴露給了別人,這通常是我不想看到的結(jié)果,那怎么去預(yù)防呢?ASP.NET Core 中有一個(gè)叫做 User Secrets 特性,它允許將用戶敏感信息存儲(chǔ)在項(xiàng)目外的一個(gè) json 文件中,那怎么去管理這個(gè) json 文件呢?你可以通過(guò) 命令行工具 Secrets Manager 去進(jìn)行敏感信息的管理,這篇文章主要就是來(lái)聊一聊怎么去管理這個(gè) User Secrets。
在項(xiàng)目中添加 user secrets
可以很方便的將 user secrets 添加到你的項(xiàng)目中,你需要做的僅僅是。
在解決方案管理器上選擇 project
右鍵點(diǎn)擊選擇
Manage User Secrets。

然后 Visual Studio 2019 會(huì)自動(dòng)打開(kāi)一個(gè) secrets.json 文件。

接下來(lái)在 secrets.json 中添加一些敏感數(shù)據(jù)。
{
??"ConnectionString":?"This?is?a?test?connection?string",
??"APIKey":?"This?is?s?secret?key",
??"AppSettings":?{
????"GlobalSettings":?{
??????"GlobalAccessKey":?"This?is?a?global?access?key!"
????}
??}
}
對(duì)了, 默認(rèn)的 secret.json 文件路徑如下:
C:\Users\38034\AppData\Roaming\Microsoft\UserSecrets\b87644d3-6898-47e4-8580-b3de15f22b96
把項(xiàng)目編譯一下,然后打開(kāi) project 的meta文件 .csproj,你會(huì)發(fā)現(xiàn)新增了一個(gè) UserSecretsId 節(jié)點(diǎn),代碼如下:
"Microsoft.NET.Sdk.Web">
??
????netcoreapp3.1
????e4f51d14-ddc1-48f4-bb34-84c114e3d6d0
??
使用 Secret Manager tool 管理工具
這個(gè) Secret Manager tool 是 .NET Core 中的一個(gè)命令行管理工具,主要用來(lái)管理 Configuration 和 敏感數(shù)據(jù),在這一節(jié)中我們一起看看怎么使用這個(gè)小工具。
生成 user secrets
在 cmd 窗口輸入如下命令:
dotnet?user-secrets?init
新增 user secrets 內(nèi)容
要想看到當(dāng)前所有的 secrets,輸入以下命令。
dotnet?user-secrets?list
下圖展示了我之前創(chuàng)建的一些 key。

接下來(lái)用 set 命令設(shè)置一條敏感數(shù)據(jù)。
dotnet?user-secrets?set?"AuthorApiKey"?"xyz1@3"
訪問(wèn) secret
為了能夠?qū)崿F(xiàn)用代碼去訪問(wèn),可以用 ASP.NET Core 里的 Configuration Api,HomeController 的代碼如下:
????public?class?HomeController?:?Controller
????{
????????private?readonly?ILogger?_logger;
????????public?HomeController(ILogger?logger )
????????{
????????????_logger?=?logger;
????????}
????????//Action?methods?go?here?-?this?is?done?for?brevity
????}
因?yàn)樾枰?Configuration Api 去訪問(wèn),這里我準(zhǔn)備用依賴注入的方式來(lái)實(shí)現(xiàn) configuration 的注入,代碼如下:
????public?class?HomeController?:?Controller
????{
????????private?readonly?ILogger?_logger;
????????private?readonly?IConfiguration?_config;
????????public?HomeController(ILogger?logger,
??????????????????????????????IConfiguration?config )
????????{
????????????_logger?=?logger;
????????????_config?=?config;
????????}
????????//Action?methods?go?here?-?this?is?done?for?brevity
????}
刪除 secret
要想刪除這個(gè) key,可以使用下面的命令。
dotnet?user-secrets?remove?"AuthorApiKey"
如果你想移除所有的key,可以使用下面的命令。
dotnet?user-secrets?clear
如果你想移除某一個(gè)層級(jí)中的子層key,可以使用 : 運(yùn)算符,代碼如下:
dotnet?user-secrets?remove?"AppSettings:GlobalSettings"
ASP.NET Core 重定義了對(duì) Configuration 中的數(shù)據(jù)配置,管理和保護(hù),而且還有這個(gè)非常 ??的 ?User Secrets,可以很好的替代以前用環(huán)境變量的方式,而且可以確保源碼中不再有任何敏感數(shù)據(jù),畢竟 User Secrets 是存儲(chǔ)在項(xiàng)目之外的一個(gè)文件夾下,這個(gè)路徑之前也給大家看到了,是 windows 的一個(gè) 用戶文件夾。
不過(guò)這里有一個(gè)缺點(diǎn),存儲(chǔ)在 User Secrets 中的數(shù)據(jù)是以明文形式存在的,不用怕,后面的文章我會(huì)討論一些其他的方法來(lái)保護(hù)用戶敏感數(shù)據(jù),比如說(shuō):Azure application settings 和 ?Azure key vault。


【附申請(qǐng)地址】阿里云網(wǎng)盤(pán),內(nèi)測(cè)資格,開(kāi)放申請(qǐng)了!非會(huì)員下載 10MB/s!有圖有真相!

臥槽:第一次見(jiàn)這么牛x的網(wǎng)站?
