本エントリは、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.RequestMetadata
にHTTPステータスコードやContent Typeなどいくつかのメタデータが取れる
かなりシンプルですね。
例えばこんな感じでやればIPアドレスによってOn/OFfをきりわけることができます*4。
本家のドキュメントにも書いてありますが、ロールを使ったり独自の認証要素などを使たりして自由にポリシーを制御することができます。
ただし、当然ですが、もちろんでですがここはアクセスされるたびに呼び出されるので、ここでヘビーな処理を書くことは避けたほうが良いでしょう。
まとめ
ということで、Glimpseのポリシーを柔軟にカスタマイズする方法のご紹介でした。
明日のOne ASP.NET Advent Calendar 2013は、割と普通さんです。期待!