ASP.NET CoreにおけるUserSecretを使用した設定情報の保存
以下の動画42分ぐらい。 https://youtu.be/pLiS7932LLo
環境変数
すべての構成ソースの構成値を上書きします.
例えば,規定のデータベース接続文字列はappsettings.jsonファイルにDefaultConnectionというキーで記述されている.
規定の接続文字列はLocalDB用.パスワードは不要.
キーの値は実行時に環境変数の値でオーバーライドされる.
環境変数には機密性の高い資格情報を持つ完全な接続文字列が含まれる.
環境変数は通常,暗号化されていない.そのため,PCまたはプロセスが侵害されたときに,ユーザーシークレットが漏洩する可能性がある.
環境変数内で階層的なキーを操作する場合,:
を使う.しかし,:
はBash環境では機能しない場合がある.二重のアンダースコア__
はすべてのプラットフォームでサポートされる.これは自動的にコロンに変換される.
シークレットマネージャー
開発中において機密データを保存するために使用する. これを使用することで,機密データの一部がアプリシークレットになる.
アプリシークレットはプロジェクトツリーとは別の場所に格納される.よって,ソース管理にチェックインされず,間違ってプッシュして公開,という危険性を回避できる. (これが重要)
アプリシークレットは特定のプロジェクトに関連付けられるか,複数のプロジェクト間で共有される.
開発目的のみで使用すること.保存された情報は暗号化されない.
キーと値はユーザープロファイルディレクトリのJSON構成ファイルに格納される.
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
シークレットマネージャーを使用する.
User Secretを使うにはdotnet user-secrets
コマンドを使う.
初めての場合はinit
をつける.
dotnet user-secrets init
これを実行する.
> dotnet user-secrets init Set UserSecretsId to '93059209-2b6f-434d-a6e3-b2fcc4fffaeb' for MSBuild project 'C:\Users\shuhey\source\repos\EFCorePractice\SqlServer\SqlServer.csproj'.
すると,プロジェクトファイル(csproj)内に<UserSecretsId>
という項目が追加される.
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <UserSecretsId>93059209-2b6f-434d-a6e3-b2fcc4fffaeb</UserSecretsId><!-- これ--> </PropertyGroup>
もしくはVisual Studioのソリューションエクスプローラでプロジェクトを右クリックしてコンテキストメニューから「Mange User Secrets」を選択する.
こんなダイアログが表示されるのでOkを.
シークレット(機密設定情報)の追加
これでVisual Studioでsecret.json
というファイルが開かれるので,ここにJSON形式で情報を記述する.
またはコマンドラインで以下のように,設定情報をキーバリューの形で登録していく.
> dotnet user-secrets set "Books:ConnectionString" "Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;" --project "C:\Users\shuhey\source\repos\EFCorePractice\SqlServer" Successfully saved Books:ConnectionString = Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True; to the secret store.
secret.jsonファイルには以下のように記述される.
{ "Books:ConnectionString": "Server=.\\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;", }
登録されている設定情報を確認するには以下のコマンドを使う.
> dotnet user-secrets list
ConnectionStrings:StudentDb = Server=.\\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;
コマンドから操作されると,内容は上記のようにフラット化される.フラット化とは,階層の表現を括弧のネストで表現するのではなく,:
でつなげて表現すること.
シークレットにアクセス
DIされたIConfigurationのインスタンスから取得できる. というか,これは利用する側(開発者)はappsettings.jsonかsecret.jsonかで書き方を変える必要はなく,secret.jsonがあれば同一キーについてはsecret.jsonから取得するようになっている.
//↓DIされたIConfigurationの(?)インスタンスである変数config. config["キー"]
ただし,接続文字列の取得はGetConnectionString
メソッドがあり,それを利用することもできる.
UserSecretの編集を便利にする
初回利用時はVisual Studioでsecret.jsonが開かれるので良いのですが,一度閉じてしまうと次に開くメニューがありません.
ない...
このままではコマンドラインから追加,編集,削除するか,もしくはファイルのパスをたどって開くかする必要があり,とても不便です.
そこでVisual Studioの拡張機能であるOpen UserSecrets
です.
詳しい使い方は作者さんの記事が詳しい.
インストールすると,以下のようにプロジェクトのコンテキストメニューにOpen UserSecrets
が追加される.
これでVisual Studioからsecret.jsonファイルを開けるのでとても便利.ありがたや~.
メモ
しかし,Visual StudioのコンソールにOpen UserSecrets
から以下のような出力があった.
Please install required pacakge Microsoft.Extensions.Configuration.UserSecrets Open UserSecret file. C:\Users\shuhey\AppData\Roaming\Microsoft\UserSecrets\d85bc42f-e33e-47f0-baeb-349a297f90ed\secrets.json
Microsoft.Extensions.Configuration.UserSecrets
をインストールするとどうなるのだろうか?
インストールしても変わらずメッセージは出ている. でも,動作には問題ない.