読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

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

WebSecurityクラスを理解する:[1]WebSedurityクラスとは?

Razor

Blogにもぽつぽつと投稿していますが、ここ最近、ASP.NET Web Pagesをよく触っています。

このASP.NET Web Pages『カジュアルなWebアプリケーションフレームワークとしてはよくできているなー』というのが、ここ最近触ってみての改めての感想です。


その一端に、WebSecurityクラスによるユーザ認証機能があります。
とても簡単にログイン認証やユーザー登録などの機能を自分のアプリケーションに実装することが出来るような機能を提供するもので、WebMatrixの「スターターサイト」やVisual Studioの「ASP.NET Webページ(Razor)」テンプレートで展開されるサンプル実装でもこれが使われています。


このしばらく、このサンプルをいじりまわしながらカスタマイズしたり機能を調べたりしていましたので、せっかくなのでその調べた事をここでシェアしてみたいと思います。

WebSecurityクラスの概要

まずは、MSDNのリファレンスを見てみましょう。
http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity%28v=vs.99%29.aspx


まず、メンバが列挙されています。
そんなに数が無く、比較的シンプルそうなのが解ります。そんなに数が無い…とはいえ、一つ一つメンバを列挙して解説するのも面白くないし面倒なので、これらは後々触れることにします。

とりあずぱっと見て目につくのは、WebSecurityクラスのメンバすべてstatic(VBでいえばShared)なメンバであることでしょうか。C#でいうと、WebSecurityクラス自体がstaticです。



次にRemarkを見ると…ASP.NET Web Pagesのリファレンスには珍しく、結構な文章量があります。
しばらくは邦訳されそうにない気がするので*1、ざっくり目を通してみると概ね以下のようなことが読み取れます。

  • 機能を絞って実装され非常にシンプルだけど最低限必要な機能が用意されているものであること
  • セキュリティも意識された実装になっていること
    • クリアテキストでパスワードを保持するオプションは無い
    • ログイン失敗が続くと自動的にアカウントを一定時間ロックする昨日があること…など。
  • ややこしい手順を踏まなくても、ちょっとした拡張が容易に出来る事、既存のユーザ情報テーブルなどとの親和性も高いこと
    • ユーザの一意IDやEmail、その他の任意のユーザの情報(氏名等の追加の属性)と、パスワードや管理のための情報を分割して管理する仕組みになっていること
    • IDをキーにして既存のユーザー情報テーブルと統合することも容易な構造であること
  • アカウントの登録やパスワードの変更、パスワード忘れに対する救済策などを実現する機能があること
  • 役割(Role)に関する機能もWebSecurityクラスは持っていないため、別のもの(SimpleRoleProvider等)を使って行ってほしいこと

要は『機能を絞ってシンプルにし、それでいてセキュリティに配慮しつつも、容易に拡張できるようなっているよ』という感じでしょうか。


また、ASP.NETに詳しい人向けの情報として『このクラスの機能を実現するために低レベルの部分ではASP.NET標準のMembershipProviderの実装を使っている』ことなども書かれており、深く理解するための情報として有用かもしれません(ただし、WebSecurityの基底クラスにMembershipProviderがあるわけではありません。WebSecurityクラスは、同じくWebMatrix.WebData名前空間にある、SimpleMembershipProviderを”利用”する実装が行われているクラスです。そしてSimpleMembershipProviderの基底クラスにMembershipProviderがある、という構図と思われます)。



Remakrsの下には、少しだけサンプルコードが提供されています。WebSecurityのLoginメソッドを使ってログインを行っているサンプルですが、さすがに…これだけだと、ちょっと雰囲気がつかみにくいかもしれませんね。お奨めは、先にも挙げたとおりWebMatrixVisual Studioのテンプレートに含まれているサンプル実装です。

次回(?)からしばらく、このサンプルテンプレートを元に、WebSecurityクラスの全貌に迫っていこうかと思います。

*1:何となくですが、なんかそんな気がする…