MVC3でサイトのアクセス制限を設定した

最近、ASP.NET MVC3をいじってWebアプリの作成をしている。
Razorなど非常に便利な機能が多く、気分良く開発を行うことが出来る。

今回はこのMVC3を使ってサイト構築をする際に認証を使ってアクセス制限を設定する手順を調べたのでブログにまとめておく。

とりあえずテスト用のサイトを構築する

はじめに、テスト用のサイトを作成する。以下のものが必要だ。

インストールが済んでいない場合はこちらからWebPIをダウンロード・インストールして取得する。

プロジェクトの作成はVS2010を起動してC#-Web-ASP.NET MVC3 Web Applicationを指定すればよい。

アクセス制限を確認する

まず、今回作成したAuthTestプロジェクトをF5で起動してみる。
ブラウザが自動で立ち上がって/Home/Indexにアクセス出来るはずだ。
これは/Home/Indexにアクセス制限が掛かっていないため、ログインしていないユーザでも普通にアクセスできているのだ。

では、アクセス制限がかかっているページはどこなのか?答えから言うと /Account/ChangePassword である。
試しにアドレスバーに/Account/ChangePasswordを入力してアクセスしようとしてみる。
すると/Account/LogOnにリダイレクトされるはずだ。

パスワードを変更するページなので、ログインしたユーザのみアクセスできるように制限がかかっているわけだ。
この制限はどこでかけられ、なぜ/Account/LogOnにリダイレクトされるのか見ていく。

制限をかけている部分はControllerにある。
Controllers/AccountControllerのChangePasswordに対するGET/POSTメソッドをみると[Authorize]と書いてあるはずだ。
要はControllerで各フォームのPOST/GETにアクセス制限を付けているのである。

リダイレクト先はWeb.configで指定している。
タグのなかで と記述されている部分がそれである。
ログインページをリダイレクト先に指定しておけば、ログインが必要なフォームへのアクセスはすべてログイン画面に
リダイレクトすることができる。

Webサイト全体にアクセス制限をかけたい

すべてのフォームのGET/POSTにいちいち[Authorize]を指定するのは現実的ではない。
Web.configでシステム全体にアクセス制限をかけるほうが現実的だろう。
方法としてはを指定して匿名ユーザからのアクセスを制限すればよい。

しかし、単純にこれをやってしまうとデバッグ時に下のような画面があらわれる。

cssを読み込めていないのである。この他にも、Register画面など匿名ユーザでもアクセスしたいリソースや画面はあるはずだ。
これは例外として除外する必要がある。そのためには再度Web.configをいじる。

を使ってアクセスを制限しないパスを追加する。
今回はcssを読み込みたいのでcssが保存されているContentフォルダのアクセス制限を解除した。