ASP.NET中Core優雅的在開發環境儲存機密(User Secrets)的詳解

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了ASP.NET Core如何優雅的在開發環境儲存機密User Secrets,具有一定的參考價值,感興趣的小夥伴們可以參考一下

前言

在應用程式開發的過程中,有的時候需要在代碼中儲存一些機密的資訊,比如加密金鑰,字串,或者是使用者名稱密碼等。通常的做法是儲存到一個設定檔中,在以前我們會把他儲存到web.config中,但是在ASP.NET Core中,這一方式或許發生了改變,或者說你有更多多元化的方法, 以及更加優雅的的配置來設定或者儲存這些機密資料。

起初我以為這個UserSecrets它並沒有什麼用,因為我有需要配置的地方我直接配置到appsetting.json檔案中就可以了,直到一次開發過程中,我才感受到了它真正的用途。

目錄

  • 使用者機密介紹

  • 如何添加使用者機密

  • 在應用程式中使用使用者機密

  • 總結

使用者機密介紹

有以下情境大家可以想一下在以前的代碼中我們是怎麼樣處理的:

  • 需要儲存一些和第三方網站對接的密鑰,比如和 ,微博網站使用的 appkey

  • 給每個開發人員配置不用的使用者名稱密碼來訪問一些資源

  • 開發人員在開發過程中使用各自原生資料庫,如何設定資料庫地址、帳號和密碼

假設說最後一項,每個開發要使用自己原生資料庫,你可能會說讓每個人修改自己的web.config,在提交代碼的時候不提交就行了。那麼如果在web.config添加其他配置項的時候,顯然不提交web.config檔案不合理的。

現在,ASP.NET Core 提供了一種很優雅簡潔的方式 User Secrets 用來協助我們解決這個事情。

在建立一個 ASP.NET Core Web 應用程式的時候,會在 Startup.cs 檔案中看到這樣一段代碼:


public Startup(IHostingEnvironment env) {  .....  if (env.IsDevelopment())  {    builder.AddUserSecrets();  }    builder.AddEnvironmentVariables();}

在 project.json 檔案中,會看到 User Secrets 相關的一些配置


{  "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這行代碼,他是在開發環境才啟動並執行。

userSecretsId是用來標識項目的User Secrets唯一性的,如果有兩個項目需要使用不同的Secrets ,這就需要有不同的userSecretsId。

Microsoft.Extensions.SecretManager.Tools 主要是用來設定或者查看secrets的值。

如何添加使用者機密

可以在命令列中使用命令來添加:

image

  • 切換命令列視窗到程式的運行目錄, 輸入 dotnet user-secrets -h ,來查看可以使用的命令

  • 使用 dotnet user-secrets list 列出所有的使用者機密

  • 使用 dotnet user-secrets set WeChatAppKey "X3423FEED2435DD"設定一個使用者機密,其中 WebChatAppKey 為鍵,後面的是值。

  • 然後使用dotnet user-secrets list來查看設定的索引值對。

  • 然後我又設定了一個資料庫的連接字串進去。

以上是使用命令列的方式來設定使用者機密,也可以使用 Visual Studio 2015代替命令列來做這項工作。

Visual Studio中,在Web項目上右鍵,可以看到一個 系統管理使用者機密 的菜單:

image

點擊開啟時候,會出現一個secrets.json的檔案,裡面就是剛剛在命令列設定的索引值對:

image

有些同學可能會問既然是儲存到secrets.json,那麼這個檔案是在哪裡呢?

secrets.json的儲存位置?

在非Windows系統中,它的儲存位置在

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

在Windows系統中,它的位置在

C:\Users\使用者名稱\AppData\Roaming\Microsoft\UserSecrets\aspnet-WebAppCore-e278c40f-15bd-4c19-9662-541514f02f3e

可以看到,儲存的上層檔案夾就是project.json檔案中的 userSecretsId 設定的值。

在應用程式中使用使用者機密

要在應用程式中訪問配置的使用者機密,你需要保證project.json檔案中存在依賴項:
Microsoft.Extensions.Configuration.UserSecrets 並且builder.AddUserSecrets()。

然後在Startup.cs檔案中通過 Configuration 對象訪問


public IConfigurationRoot Configuration { get; }public void ConfigureServices(IServiceCollection services){  var wechatKey = Configuration["WeChatAppKey"]}

你可以使用DI來將使用者機密映射到一個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檔案中相同節點(衝突)的配置項,那麼就會被secrets.json中的設定項給覆蓋掉,因為 builder.AddUserSecrets()晚於 AddJsonFile("appsettings.json")註冊, 那麼我們可以利用這個特性來在每個開發人員的機器上重新設定資料庫連接字串了。

總結

以上,或許可以感受到微軟在 ASP.NET Core 中對於開發人員還是非常貼心的,很多小細節都考慮到了,因此在我們構建應用程式的過程中,可以多使用這些小功能(特性)來讓我們的代碼更加的優雅~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.