あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

.NET Coreのデータベース接続文字列を外部ファイルに保存する

.NET Core のプログラムでデータベース接続文字列をソースコードに記述していると、以下のような警告がビルド時に出力されるようになります。

Models/consoletestContext.cs(15,10): warning CS1030: #warning: 'To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.'

この警告を回避するには、appsettings.json に接続情報を保存して、プログラム実行時に読み込むように変更します。

なお、環境は Mac (macOS High Sierra 10.13.3) で .NET Core SDK 2.1.4、PostgreSQL 10.3 、Visual Studio Code になります。

まず、JSON の設定ファイルを読み込むために、Microsoft.Extensions.Configuration.Json パッケージを NuGet でインストールする必要があります。

$ dotnet add package Microsoft.Extensions.Configuration.Json

それから、プロジェクトのルートディレクトリに、接続文字列を含んだ appsettings.json ファイルを以下のように作成します。

{
    "ConnectionStrings": {
      "DefaultConnection": "Server=localhost;Database=databasename;Username=username;Password=password;"
    }
}

Program.cs に以下のように設定ファイルを読み込む内容を追加します。

using System;
using System.IO;
using System.Data;
using System.Linq;
using ConsoleTest.Models;
using Microsoft.Extensions.Configuration; //追加

namespace ConsoleTest
{
    class Program
    {
        public static IConfiguration Configuration { get; set; } //追加
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json"); //追加

            Configuration = builder.Build(); //追加


            using (var db = new consoletestContext())
            {
                foreach (var book in db.Books)
                {
                    Console.WriteLine(book.Title);
                }
            }
        }
    }
}

そして、dbnameContext.cs を以下のように書き換えます(抜粋)

using Microsoft.Extensions.Configuration; //追加
using ConsoleTest; //追加

//(中略)

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            //追加
            optionsBuilder.UseNpgsql(Program.Configuration.GetConnectionString("DefaultConnection"));
        
            //コメントアウト
            // optionsBuilder.UseNpgsql(@"Server=localhost;Database=databasename;Username=username;Password=password;");
        }
    }

これができたらビルドして実行します。

$ dotnet build
$ dotnet run

これで接続文字列を保存できるようになりましたね。また、接続文字列を一元管理できるようになりました。

■参考サイト