かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

App.config / Web.config に秘密の情報を入れたいときはどうする? その 2

blog.okazuki.jp

さて、時代はクラウドですね。 ということでクラウド使う場合はどうなの?っていうケースです。

ASP.NET MVC では Web.config に設定を書きます。 開発中はローカルにあるエミュレーターとかを使うという感じにしておけば Web.config にはとりあえず開発ローカルエミュレーターとかに繋ぐために情報などを入れておけばいいでしょう。

こんな感じで。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0"/>
    <add key="webpages:Enabled" value="false"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    <add key="Secret" value="ローカルの秘密情報だよ!"/>
  </appSettings>
  <!-- 省略 -->

もし、この情報すらリポジトリに入れたくない場合は、その1で紹介した方法で入れないようにすればいいでしょう。 読み取り方はいつも通り ConfigurationManager になります。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace SecretSample.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            ViewBag.Secret = ConfigurationManager.AppSettings["Secret"];
            return View();
        }
    }
}

本筋とは関係ないですが、cshtml 側で以下のように表示するようにしました。

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>@ViewBag.Secret</p>

実行すると以下のような感じです。

f:id:okazuki:20180629170635p:plain

ここまでは問題ないでしょう。

本番環境ではどうする?

クラウドにデプロイしたらどうなるか?というところですが Microsoft Azure の App Service 系のサービスには「アプリケーション設定」という項目があって、そこに Web.config で設定している AppSettings や ConnectionStrings が指定可能です。

f:id:okazuki:20180629171838p:plain

おそらくちゃんとやるなら、どこかの自動ビルドの仕組みからデプロイしてると思うので .gitignore とかに指定してれば変なファイルがもぐりこむこともありません。

完璧!しかも config ファイルに書くよりもこっちのほうが優先されます。

f:id:okazuki:20180629172149p:plain

つづく

次はもっと秘密にしたい情報についてどうするかということを書きたいと思います。