かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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

つづく

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