DBへの接続文字列やパスワードとなどの重要なデータは、安全な場所で管理しておく必要があります。
よく見かけるサンプルソースなどでは「appsettings.json」に定義しているケースがありますが、あまりよろしくないように思われます。
Azure App Serviceでは環境変数を利用することで、これらの値を安全に管理することができます。
ー 開発環境 ー
Visual Studio 2019
.NET Core 3.1
ローカルテスト環境での環境変数
ローカル環境では「secrets.json」というJSON形式のファイルを使って管理することができます。
ソリューションエクスプローラからプロジェクトを右クリックし、メニューから「ユーザー シークレットの管理(G)」をクリックすると「secrets.json」ファイルが開きます。
以下の例では「Secrets.json」に「TestID」と「TestSecret」という変数を定義してみました。
{ "TestID": "12345", "TestSecret": "9876543210" }
「secrets.json」ファイルは「C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\UserSecrets\[シークレットID]\secrets.json」のような場所へ保存されます。
プロジェクトのフォルダとは別の場所に保管されるので誤ってGitHubへアップしてしまうといったミスは起きないでしょう。
Azure環境での環境変数
Azureへデプロイした環境では「secret.json」を参照できません。
Azureサーバーに改めて環境変数を定義する必要があります。
Azureポータルサイトから設定する
環境変数はAzureのポータルサイトから設定できます。
ポータルサイトを開き、App Serviceから設定したいアプリを選択します。
メニューから「構成」を選択すると「アプリケーション設定」が行えます。
環境変数を追加するには「新しいアプリケーション設定」をクリックして名前と値を入力します。
最後に「保存」をクリックすれば設定は完了です。
Visual Studioから設定する
Azureポータルサイトを開かなくてもVisual Studioから設定することも可能です。
メニューから「ビルド(B)」→「発行(H)」を選択して公開画面を表示します。
ホスティング欄にある「…」ボタンをクリックして「Azure App Serviceの設定を管理する」を選択しましょう。
↓
環境変数がリストアップされます。
ローカル欄にはsecrets.jsonに指定した値が入っていると思います。
リモート欄にAzureサーバー環境で利用する値を入力して「OK」をクリックしましょう。
アプリケーションから環境変数を取得する
アプリケーションから環境変数の値を取得する方法は以下の通りです。
IConfigurationから取得する
以下の例では Startup クラスで値を取得しています。
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace WebApplication1 { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { var testId = Configuration["TestID"]; var testSecret = Configuration["TestSecret"]; services.AddControllersWithViews(); } : : } }
以下の例はMVCモデルのControllerクラスで値を取得しています。
DI(Dependency injection)の仕組みを使って、コンストラクタで「IConfiguration」オブジェクトを受け取るように改良しています。
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using System.Diagnostics; using WebApplication1.Models; namespace WebApplication1.Controllers { public class HomeController : Controller { private readonly IConfiguration _configuration; //追加 private readonly ILogger<HomeController> _logger; public HomeController(IConfiguration configuration, ILogger<HomeController> logger) //パラメータを追加 { _configuration = configuration; //追加 _logger = logger; } public IActionResult Index() { var testId = _configuration["TestID"]; //環境変数を取得 var testSecret = _configuration["TestSecret"]; //環境変数を取得 return View(); } : : } }
コメントをお書きください