這篇文章主要為大家詳細介紹了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/291d8de402df09abb5ccc62c3f9cde7e/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 中对于开发人员还是非常贴心的,很多小细节都考虑到了,因此在我们构建应用程序的过程中,可以多使用这些小功能(特性)来让我们的代码更加的优雅~
以上是ASP.NET中Core優雅的在開發環境保存機密(User Secrets)的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!