きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

Glimpseのポリシーをコードで制御する

本エントリは、One ASP.NET Advent Calendar 2013 7日目対応のエントリです。 前日は、miso_soup3さんのASP.NET Web API 2 で追加された機能についてでした。さすがですね。

私はかなり軽めに、GlimpseのちょっとしたTIPS?を紹介したいと思います。

 

Glimpseの有効・無効をIPアドレスで切り分けたい

以前にも紹介したGlimpse』、便利ですよね。ASP.NETでの開発には欠かせないツールなんじゃないでしょうか。

 

とても便利なので、開発時だけでなく本番リリース後でも障害対応やらなんやらで活用したい……と思うのは道理だと思います。

とはいえ、本番環境で誰でもアクセスできるようですと、それはそれで問題ありそうです。セキュリテ上の懸念もありますし*1、ユーザさんがアクセスしたときにHUDが出てきたら『????』とかなっちゃったりしてクレーム案件になる可能性もあります。

もちろんGlimpseではそのあたりも考えられていて、例えば、デフォルトの設定ではリモートからのアクセスでは無効になっています。 この制御はWeb.Configで設定することが可能になっており、リモートアクセスのOn/Offの他、Content Typeやアクセス先URL、HTTPのステータスコードで有効無効を切り替えるような設定可能です。

これらについての詳細は、こちらのConfiguring runtime policyがオフィシャルなドキュメントとなっていますので、一度目を通しておくことをお勧めします。

 

さて、今回、諸般の事情でIPアドレスベースで制御したいという事案に遭遇しました。ところが、どうやらWeb.Configによる設定ではIPアドレスによるOn/Offの制御は不可能な模様です*2

さて、どうしたものか……。

 

セキュリティーポリシーをコードで制御する

答えはドキュメントのここ、Custom Runtime Policyに書いてありました。

大雑把にかいつまむと、

  • IRuntimePolicyを継承したカスタムポリシーを実装すればおk!
  • 中身をコメントアウトしたスタブをNuGetで一緒にぶち込んでるからそれに実装すればおk!

ということらしいです(多分)。

 

GlimpseをNuGetからインストールした際にお気づきになっている方もおられたかと思いますが、プロジェクトのルートに「GlimpseSecurityPolicy.cs」というファイルがインストールされます。これが件のCustom Runtime Policyを実装するクラスのスタブになっていて、コメントアウト解除し必要な処理を書くことでセキュリティーポリシーの制御をカスタマイズすることができるようになっているのです。

 

スタブはごくシンプルですので見ればわかるとは思いますが、何点かポイントを。

  • アクセスがある度にExecuteメソッドが呼ばれる*3
  • Executeメソッドの戻り値としてRuntimePolicy.Onを返すとGlimpseが有効になる。RuntimePolicy.Offを返せば無効
  • Executeメソッドの引数policyContextから、判定に必要な値を取得して処理する
    • policyContext.GetHttpContext()でカレントのHTTP Contextが取得できる。
      • もちろんサーバ変数やCookiesの内容等もここから取れる
    • policyContext.RequestMetadataHTTPステータスコードやContent Typeなどいくつかのメタデータが取れる

かなりシンプルですね。

例えばこんな感じでやればIPアドレスによってOn/OFfをきりわけることができます*4

本家のドキュメントにも書いてありますが、ロールを使ったり独自の認証要素などを使たりして自由にポリシーを制御することができます。

ただし、当然ですが、もちろんでですがここはアクセスされるたびに呼び出されるので、ここでヘビーな処理を書くことは避けたほうが良いでしょう。

 

まとめ

ということで、Glimpseのポリシーを柔軟にカスタマイズする方法のご紹介でした。

明日のOne ASP.NET Advent Calendar 2013は、割と普通さんです。期待!

*1:Web.Configもセッション変数も、アドオンを入れていればSQLも丸見えでです

*2:どうやら昔はWeb.Configで設定できたようなのですが、1.4くらいでその機能が削除された模様

*3:Web.Config上の設定で無効になっている場合はExecuteメソッドも呼ばれない

*4:サンプルなので実装は適当です