ASP.NET Core MVC の SecretManager 機能を使う
ASP.NET Core2.0 には SecretManager という機能があります.プログラムにパスワードや鍵を埋め込む必要があることは多々ありますが,Github等で管理している場合ハードコードすることができません.なのでそういったデータをプロジェクトディレクトリではなくユーザーディレクトリのある場所にまとめて保存しておき,どのプログラムからでも一律の方法で呼び出せる機能を提供するのが SecretManager です.実体はsectets.jsonというファイルに保存され,各OSで場所が違います.
環境は前回と同じものとします.
VisualStudioから編集
ソリューションエクスプローラーからプロジェクトのメニューを開き,ユーザーシークレットの編集をクリックします.エディタで secrets.json が開かれるので適当に編集し保存します.
プログラムから呼び出し
jsonですが,JavaScriptのように Twitter.ConsumerKey
とするわけではなく,Twitter:ConsumerKey
のようにコロンでつないでアクセスします.また,Keyにコロンが入っているのもOKなのでアクセス側から階層構造がよく分からないですね.まぁそんなに大量の複雑なデータを放り込むようなものでもないのでいいでしょうか.
Startup.cs
public class Startup { public static string TwitterConsumerKey; public static string TwitterConsumerSecret; public Startup(IConfiguration configuration) { Configuration = configuration; TwitterConsumerKey = configuration["Twitter:ConsumerKey"]; TwitterConsumerSecret = configuration["Twitter:ConsumerSecret"]; } }
Startup以外でIConfiguretionを取得する方法もあるのかもしれませんが,static用域に保存しておけばいいと思います.
コンソールから登録
コマンドは単純ですが,お膳立てについて案の定まともな情報が転がっておらず…
コマンド自体はコレ
dotnet user-secrets set "Twitter:ConsumerKey" "yukamwaki_totoi"
No executable found matching command "dotnet-user-secrets"
(# ゚Д゚)ハァ?
"SecretManagerはNetCoreの機能でーす!"みたいな雰囲気を醸し出しているんですが,Coreのコマンドではなく SecretManager の NugetPackage に入っているのです.で,これ系のコマンドはどこでも使えるコマンドではなくCSPprojectディレクトリじゃないと実行できません.しかも,.csproject に Mixrosift.Extension.SecretMansger.Tools の使用宣言げ必要です.
<Project Sdk="Microsoft.NET.Sdk.Web"> ... <ItemGroup> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.4" /> <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" /> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup> </Project>
私は発行からビルド済みのデータだけデプロイしているので,開発PCか .csprojectファイルをコピーしてきます.その後,コピー先のディレクトリで
dotnet restore dotnet user-secrets set "Twitter:ConsumerKey" "yukamwaki_totoi"
secrets.json を確認すると "Test:maki": "123456"
が入っているはずです.
もっとスマートなやり方があるはずだと思うのですが…というか一般的にはソースごと持って行って現場でコンパイルすのが一般的なのでしょうか?