使用 dotnet user-secrets 儲存敏感資訊

紀錄一下如何透過 dotnet user-secret 儲存敏感資訊

Intro

專案通常會有一個配置檔案,在 dotnet 則是儲存於 appSetting.json,這隻檔案應該要進版控,因為有它專案才完整,但如果是ㄧ些比較敏感的資訊就不合適一起進入版控,例如一些 token或者是一些比較敏感的資料,可能是關於安全的,可能是關於錢的,反正這些東西進入版控就會有一些風險。所以我們不會想要這些東西進入版控,在 dotnet 的世界裏面有一個東西可以解決這件事情,就是 user-secret

簡單的來說,既然你不想把這些東西進版控,那就另外放在別的目錄,跟專案隔開來,這些敏感資訊也只會留在你的電腦中,不會進入版控,也不會 deploy 出去。他的概念其實就只是這樣,實際的做法則是在你本機上的目錄做一個 json 檔案,當專案有設定,他會去找這個檔案。如果secret.jsonappSetting.json有同樣的設定,則是會以secret.json的設定為準


How To Start

輸入dotnet user-secrets指令可以看到說明,所以使用方法就是在沒有用 user secret的專案,先透過 init來初始化

1
2
# 產生 secret 的 guid
dotnet user-secrets init

做完這件事情之後,專案檔會被加入一段 XML Tag,用來記錄所產生的 Guid,接著可以透過 clearlistsetremove來管理,這個應該就不用多講了,不過如果是在本機開發,我會建議還是直接開啟 json 檔編輯比較直接。 cli 指令可以等到需要自動化作業的時候再研究語法即可。

VisualStudio 2022 似乎可以在專案右鍵從跳出來的選單中找到使用者秘密的選項,點選後會直接幫你把 json 檔開起來,Rider 則需要安裝外掛.​NET Core User Secrets,然後 RightClick Solution -> Tools -> Open Project User Secrets 開啟檔案

範例設定

appSetting.json

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"LineBot": {
"channelAccessToken": "<your-channel-access-token>",
"adminUserId": "<your-line-user-id>"
},
"AllowedHosts": "*"
}

secrets.json

1
2
3
4
5
6
{
"LineBot": {
"channelAccessToken": "I am real channel access token",
"adminUserId": "I am admin user id"
}
}

佈署到 Azure

佈署到 Azure 則是需要在應用程式設定中自己新增

假設以這樣的結構來說,我在 azure 的設定就是

1
LineBot:adminUserId

驗證一下 azure 設定是不是真的有吃到,我做了一個簡單的 Controller 去抓設定值並顯示,並且改了一個設定,測試是否會出現在 azure 網站上


應用程式設定修改之後記得按下儲存,他會重新啟動網站



結論

設定值如果要往下一個節點,就用冒號隔開,這個東西很簡單,但是也很容易忘記細節,主要是怕自己忘記在 azure 要怎麼設定,剛好有機會就隨手紀錄一下