[ASP.NET Core] 使用User Secret安全存放開發應用程式密鑰(VS 2017)

當開發時,會使用到各種密鑰

不管是App Secret, API Key還是DB的Connection String

該如何的安全保存這些資料呢並且上傳至線上版控如GitHub等

就來使用User Secret吧

----

又是一個休假的日子

於是就來寫個閱讀心得當個以後開發筆記用

正文開始

-----

這次在ASP.NET Core Intermediate的課程中

提到了許多環境變數的設置方式

但現在的開發人員通常會把自己的專案放到GitHub等線上版控系統中

如果又是公開或者作者想開源的狀況下

很容易忘記把自己的一些私鑰或者API KEY藏好,就很歡樂的放上去了(灑花

於是就#只要出問題推給駭客入侵就對了(YA~

當然這也是資安的一部分(然後就想著台灣一般民眾的資安觀念.....淚....

以下以一個ASP.NET Core包含DB存取的專案在"開發階段"做介紹

在Visual Studio開發環境下

在專案啟動載入Startup.cs檔時ConfigureServices將會載入DB的連線字串

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

而DB的連線字串內容會放在appsettings.json檔案裡

環境變數的部分會放置於

專案(Project)->"專案名稱"屬性裡的偵錯頁籤裡

當然也可以把連線字串寫在專案屬性裡

如果我們在專案屬性新增連線字串在環境變數,並於Index.cshtml

利用Dependency injection的方式於頁面顯示連線字串

@page
@inject Microsoft.Extensions.Configuration.IConfiguration Configuration
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<h1>This is my ConnectionString: @Configuration["ConnectionStrings:DefaultConnection"]</h1>

可發現偵錯下連線字串已改為由環境變數複寫

當然在這樣的狀況下,把整個專案丟到GitHub上,詳細的內容整個pull下來還是如同明文一樣,只是放在隱藏處而已

那該如何在開發時"安全"的藏好密鑰並且能上傳至GitHub並公開給大家呢?

以下就在"開發階段"使用Visual Studio 2017開發ASP.NET Core專案如何使用User Secret保存密鑰

----

以Visual Studio 2017開發環境下

在專案名稱上點選右鍵->Manage User Secrets

此時會看到一個secrets.json檔被建立起來,但在專案總覽裡面看不到此檔案名稱

並且專案的csproj檔會新增兩個屬性

於<PropertyGroup>新增了<UserSecretsId>

<UserSecretsId>產生了本專案的GUID

而在<ItemGroup>則是載入了Microsoft.Extensions.SecretManager.Tools套件

接著在secrets.json新增連線字串

注意!!!若專案屬性裡有相同變數名稱將會以專案屬性裡的變數蓋過

啟動偵錯後將會看到連線字串是由secrets.json所定義

但為何這樣就可以避免別人竊取機密了呢

因為secrets.json根本沒在專案資料夾裡(笑~

secrets.json檔案位置在

windows:%APPDATA%\microsoft\UserSecrets\\secrets.json

Linux, Mac OS: ~/.microsoft/usersecrets//secrets.json

所以當使用版控時,並未包含在裡面,當然就偷不了

當上傳至Azure後也可以發現因為沒有secrets.json檔

因轉而使用原本的appsetting.json檔裡的預設字串

那該如何新增私鑰變數於使Azure App Service存取呢?

於App Services裡Settings裡的Application settings管理

當然如果有其他變數的話就放在Application settings

此時就可以看到整個App Service抓到的是由Application settings所定義的內容了

----

以Visual Studio Code開發ASP.NET Core專案使用User Secret

----

參考資料:

Safe storage of app secrets in development in ASP.NET Core

Managing Secrets in .NET CORE 2.0 Apps

ASP.NET Core - Intermediate(MVA 影片)

 


 

  • 文章中的敘述或資訊有誤,歡迎回應指正,討論與指教是進步的原動力:)
  • 喜歡此點部落文章,歡迎各位轉載並於文末附載原文網址超連結與站名【DriftMind】