shuhelohelo’s blog

Xamarin.Forms多めです.

ASP.NET CoreにおけるUserSecretを使用した設定情報の保存

docs.microsoft.com

以下の動画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」を選択する.

f:id:shuhelohelo:20191110104609p:plain

こんなダイアログが表示されるのでOkを. f:id:shuhelohelo:20191110104744p:plain

シークレット(機密設定情報)の追加

これでVisual Studiosecret.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が開かれるので良いのですが,一度閉じてしまうと次に開くメニューがありません.

ない... f:id:shuhelohelo:20191228211551p:plain

このままではコマンドラインから追加,編集,削除するか,もしくはファイルのパスをたどって開くかする必要があり,とても不便です.

そこでVisual Studio拡張機能であるOpen UserSecretsです.

f:id:shuhelohelo:20191228211858p:plain

詳しい使い方は作者さんの記事が詳しい.

tech.guitarrapc.com

インストールすると,以下のようにプロジェクトのコンテキストメニュー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をインストールするとどうなるのだろうか?

インストールしても変わらずメッセージは出ている. でも,動作には問題ない.