API の接続キーをデバッグ実行時に安全に取り扱いたいですよね。
ハードコードしてリポジトリにプッシュなんかしちゃいけない。
ASP.NET Core と VisualStudio の開発環境だったら、とっても簡単に管理できます。
環境
Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.6.2
.NET 6
手順
1. ユーザーシークレットを追加する
- プロジェクトファイルを右クリック
- [ユーザー シークレットの管理(G)] をクリック
-
secrets.json
がテキストエディタ―で開かれるのでシークレットを追加する
{
"Demo": {
"Secret": "demo-secret"
}
}
JSON ファイルは以下に保存されます。
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
このプロジェクトをプルした人は、[ユーザーシークレットの管理(G)] をクリックするとプロジェクトに設定された <user_secrets_id>
で JSON ファイルが作成されるので、そのファイルにシークレットを書いてあげれば OK です。
2. IConfiguration を DI してシークレットを取得する
ASP.NET Core では何も設定せずに IConfiguration
が DI されます。受け取る部分だけ実装してあげれば簡単にシークレットを取得できます。
今回は、ASP.NET Core MVC プロジェクトを新規作成したときの HomeController
で上記シークレットを使ってみます。
-
IConfiguration
をコンストラクターで DI する
+ private readonly IConfiguration _configuration;
private readonly ILogger<HomeController> _logger;
public HomeController(
+ IConfiguration configuration,
ILogger<HomeController> logger)
{
+ _configuration = configuration;
_logger = logger;
}
2. Index()
メソッドでシークレットを取得してみる
public IActionResult Index()
{
+ IConfigurationSection config = _configuration.GetSection("Demo:Secret");
+ string value = config.Value;
+ if (string.IsNullOrEmpty(value))
+ {
+ _logger.LogError("Empty configuration!");
+ }
+ else
+ {
+ _logger.LogInformation("Value: {Value}", value);
+ }
+
return View();
}
3. デバッグ実行して確認
info: HigeDaruma.WebAppDIDemo.UI.AspNetCoreMvc.Controllers.HomeController[0]
Value: demo-secret
あっという間にできました。これでソースコード上にシークレットを書く必要がなくなりました。
運用環境では Azure App Service などの環境変数としてシークレットを設定してあげれば良いでしょう。
いや、Key Vault を使わなきゃならないか・・・
参考