.NET Core程式中使用User Secrets儲存敏感性資料

來源:互聯網
上載者:User

標籤:資料庫連接   原始碼   設定檔   伺服器   開發人員net   

在開發中經常會用到一些敏感性資料比如AppSecret或資料庫連接字串無論是寫入程式碼還是寫在設定檔中最終都要push到svn或git上。對於開源項目這些敏感性資料就無隱私可言了對於私人項目一旦原始程式碼控制伺服器被黑這些敏感性資料也將暴露無遺。所以最佳實務就是不要將敏感性資料寫到原始碼中。

以往我們常常將資料庫連接字串寫在web.config中.NET Core中寫在appsettings.json中開發環境下如果一個開發人員修改了連接字串為了不影響其他開發人員每次提交代碼的時候就應該忽略該設定檔如果還添加了其他配置必須提交的話要麼先撤銷連接字串的修改再提交要麼直接提交會影響其他開發人員。很多時候我們就是直接提交了大不了其他開發人員pull下來代碼再修改一下。但是最佳實務就是不要寫在設定檔中。

注意上面提到的問題都是在開發環境下。

Secret Manager

.NET Core中為我們提供了叫Secret Manager的工具可以實現上文中的最佳實務再次強調一次Secret Manager只適用於開發環境中。

下面說一下Secret Manager它幫我們抽象了一些細節比如資料存放區在哪以及如何儲存的問題。簡單來說它協助我們將資料以明文的形式存在了本地的一個json檔案中。系統不同儲存的位置也不一樣。

Windows

%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json

Linux

~/.microsoft/usersecrets/<userSecretsId>/secrets.json

Mac

~/.microsoft/usersecrets/<userSecretsId>/secrets.json

userSecretsId是在.csproj檔案中指定的會在下文講到。

安裝、使用

配置User Secrets及訪問需要用到兩個包分別為

Microsoft.Extensions.SecretManager.Tools
Microsoft.Extensions.Configuration.UserSecrets

簡單說一下兩者的作用第一個是工具包可以使用dotnet user-secrets命令將資料存放區到json檔案中第二個包可以通過.NET Core的配置系統訪問儲存在json檔案中的資料。

dotnet user-secrets -h

這個命令可以查看Secret Manager的用法。

它有4個命令

命令 描述 文法
clear 刪除程式中所有的secrets dotnet user-secrets clear
list 列舉程式中所有的secrets dotnet user-secrets list
remove 刪除指定的secret dotnet user-secrets remove NameOfSecret
set 設定secret dotnet user-secrets set NameOfSecret ValueOfSecret

以Mac上舉例上面的命令都是操作~/.microsoft/usersecrets/\/secrets.json這個檔案userSecretsId指定了是哪個項目的secrets。

userSecretsId在.csproj檔案中指定。

<PropertyGroup>  <UserSecretsId>userSecretsId的值</UserSecretsId></PropertyGroup>

在mac或linux上userSecretsId的值可以通過uuidgen產生。

在Microsoft.Extensions.Configuration.UserSecrets包擴充了ConfigurationBuilder包含一個AddUserSecrets的擴充方法。如果想通過Configuration訪問User Secrets只需要在調用build.AddUserSecrets()即可。

if (env.IsDevelopment()){    // 搜尋包含類型Startup的程式集添加User Secrets的配置源Startup也可以換成其他程式集中的其他類型    builder.AddUserSecrets<Startup>();}

或乾脆直接指定userSecretsId

if(env.IsDevelopment()){    builder.AddUserSecrets("UserSecretsId");}

然後就可以通過Configuration["NameOfSecret"]訪問到User Secret了。

項目實踐

下面通過一個控制台程式示範。

  1. mkdir user-secrets && cd user-secrets # 建立一個目錄

  2. dotnet new console # 建立一個控制台應用

  3. dotnet restore # 還原包

  4. dotnet add package Microsoft.Extensions.Configuration.UserSecrets -v 1.1.2 # 安裝包

  5. code . # 使用Visual Studio Code開啟

  6. 在user-secrets.csproj中添加UserSecretsId

    <PropertyGroup><UserSecretsId>3BF2D901-89B9-437D-8856-CCA63D4606F7</UserSecretsId></PropertyGroup>

    以及SecretManager工具包

    <ItemGroup><DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" /></ItemGroup>
  7. dotnet user-secrets set AppKey 12345 # 添加名為AppKey的Secret

  8. 為了判斷是在開發環境中需要添加環境變數因此需要再安裝一個包
    dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables -v 1.1.2

  9. 開啟Program.cs加入以下代碼

    class Program{    public static IConfigurationRoot Configuration { get; set; }    static void Main(string[] args)    {         var builder = new ConfigurationBuilder()        .AddEnvironmentVariables();        var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");        if (environment == "Development")        {            builder.AddUserSecrets<Program>();        }        Configuration = builder.Build();        Console.WriteLine(Configuration["AppKey"]);    }}
  10. 運行
    ASPNETCORE_ENVIRONMENT=Development dot
    net run

    export ASPNETCORE_ENVIRONMENT=Development
    dotnet run

ASP.NET Core類似這裡就不再示範了。


.NET Core程式中使用User Secrets儲存敏感性資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.