Skip to content
戻る

ASP.NET CoreでAPIキーなどの秘匿情報をsecret.jsonを使用して秘匿する

Published:  at  07:08

概要

ASP.NET Core MVCプロジェクトでこちらの公式ドキュメント 🔗のコードのまま実装しています。
しかし、このままではappsettings.jsonをgit commitする際に除外するか書き換えるなどの面倒な方法をとっていました。

appsettings.jsonと同じ使い方のできるsecrets.jsonを作成してGit管理外とする方法は知ってはいたのですが
Windows環境(VisualStudio 2017)を使用した方法ばかりでMac環境で実行する方法がわからなかったのでそのメモです。
(VisualStudio 2017での追加方法はこちらの公式ブログ 🔗で解説されています。)

目次

環境

参考サイト様

https://docs.microsoft.com/ja-jp/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=macos 🔗

前提

$ dotnet new mvc -n hoge -au Individual

テンプレートから作成されたプロジェクトなので今回は問題ないが素で作成しているのであれば下記パッケージの追加が必要

現状

Twitter認証部分のコードです。公式ドキュメントのサンプルコードとほぼ変わりません。
今回はConnectionStringsAuthentication部分をsecrets.jsonへ移植します。

{
  "ConnectionStrings": {
    "DefaultConnection": "SQLServer用接続文字列",
    "MySQLConnection": "MySQL用接続文字列"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Authentication": {
    //Twitter APIキー
    "Twitter": {
      "ConsumerKey": "ConsumerKey",
      "ConsumerSecret": "ConsumerSecret"
    }
  }
}
public void ConfigureServices(IServiceCollection services) {
	//省略
    services.AddAuthentication().AddTwitter(twitterOptions => {
        twitterOptions.ConsumerKey = Configuration["Authentication:Twitter:ConsumerKey"];
        twitterOptions.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
		//省略
    });
	//省略
}

secrets.jsonの作成

公式ドキュメントのチュートリアルには下記のパスにディレクトリが存在するような記載がありますが存在しておらず頭を抱えていました。

~/配下に.microsoftなんてなくない…?」
とりあえずググりdotnet cliで作ることができるっぽいことがわかりました。

下記のdotnet user-secrets set <key> <value>コマンドを実行すると上記パスの配下にsecrets.jsonが作成されたことが確認できました。
※コマンドについては.csprojファイルが存在するディレクトリで実行すること
 別パスで実行する場合は--projectオプションで.csprojファイルを指定する。

$ dotnet user-secrets set "hoge" "fuga"
Successfully saved hoge = fuga to the secret store.
$ ls -l ~/.microsoft/usersecrets/<UserSecretsId>/
total 8
-rw-r--r--  1 z  staff  495  3  5 01:15 secrets.json
$ cat ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json
{
  "hoge": "fuga"
}

secrets.jsonができてしまえばこちらのものです。機密としたいTwitter APIキーとDB接続文字列をappsettings.jsonから移植します。

{
  "ConnectionStrings": {
    "DefaultConnection": "SQLServer用接続文字列",
    "MySQLConnection": "MySQL用接続文字列"
  },
  "Authentication": {
    "Twitter": {
      "ConsumerKey": "ConsumerKey",
      "ConsumerSecret": "ConsumerSecret"
    }
  }
}

私はsecrets.jsonを直接エディタで編集しましたが公式ドキュメントには下記のコマンドで一括でsetするコマンドも記載がありました。
内容をパイプで渡してるだけですが…

$ cat ./input.json | dotnet user-secrets set

動作確認

こちらの公式ドキュメント 🔗内でStartup.csのコードを触る風に書いてますが私の環境ではコードを編集せずそのまま実行することが可能でした。

雑感

~/.microsoft/usersecrets/<UserSecretsId>/ディレクトリが存在していなくて後回しにしていたんですが
Twitter APIのConsumerキーをいちいち書き換えるのが面倒すぎてgit commitをためらっていたのでやっと楽になりました…



前の記事
ASP.NET Core MVCアプリをAWS Lightsail(CentOS 7)で公開する。
次の記事
EntityFramework CoreでDBの状態を過去のマイグレーションに戻す。