IIS7 Web フォーム認証を使用したアクセス権の設定
IIS 7 では、ASP.NET Web フォーム認証が Web サイトの標準的な認証方式して使用できるようになっています。
Web フォーム認証が提供しているのは、一見、ログイン際の認証/承認の機能だけのように見えますが、実は下位ディレクトリ各々に対する "アクセス制御" の機能も提供しています。
"アクセス制御" の機能を使用すると、ログインが完了したユーザーアカウントの中から、さらに"見せたい人にだけ見せる" ということが可能になります。
この機能はさまざまなことに利用できます。
たとえば、管理者専用のディレクトリを用意して管理用ページを配置したり、会社で使用するのであれば、部署ごとにディレクトリを用意して、セキュアなグループ専用ページを配置したり、コンシューマー向けのサービスであれば、プレミアム会員向けのディレクトリを用意して、お宝コンテンツを配置したり、といったことが可能です。
この"アクセス制御" は、.NET ユーザーアカウントごとの個別設定も可能ですが、"役割" (ASP.NET では "ロール" と表される) というセキュリティグループ的なものを利用して、複数のユーザーアカウントをグループ単位でまとめて管理するといったことも可能です。
今回はこの "アクセス制御" の設定方法をご紹介します。
ユーザーアカウントへのアクセス制御
Web フォーム認証が正常に動作している Web サイトにおいては、[承認規則] の設定のみで、ユーザーアカウントごとのアクセスのアクセスの制御を行うことができます。
設定手順は以下のとおりです。
IIS 管理ツールを起動
IIS 管理ツール画面左のツリービューを展開し、Web フォーム認証が適用されているサイトの内の、目的のディレクトリを選択
画面中央の[機能ビュー] から[承認規則] アイコンをダブルクリックして[承認規則] の設定画面を表示
[承認規則]のリストで、"すべてのユーザー" に対する "許可" の設定を選択し、画面右の [操作] パネルの [削除] リンクをクリックして削除
[操作] パネルの [許可規則の追加] リンクをクリック
[許可の承認規則の追加] ダイアログボックスが表示されるので、[指定されたユーザー] オプションボタンにチェックをつけ、テキストボックスにアクセスを許可する .NET ユーザーアカウントを入力
[OK] ボタンをクリック
[承認規則] のリストに、"匿名ユーザー" に対する "拒否" の設定があるか確認し、なければ画面右の [操作] パネルの [拒否規則の追加] リンクをクリックして "すべての匿名ユーザー" に対する拒否規則を追加
以上でディレクトリに対する、ユーザーアカウント個別のアクセス制御設定は完了です。
コンテンツへのアクセス制御の効果を確認するために、アクセス制御を設定したディレクトリには適当なコンテンツを配置してください。
適当なコンテンツが思いつかない場合は、この記事で紹介している、ユーザーアカウント作成用のページ createUser.aspx を配置してください。
検証のために、アクセス許可を設定した .NET ユーザーアカウントとは別のアカウントを使用して Web サイトにログインし、アクセス制御を設定したディレクトリ内のコンテンツにアクセスしてください。
アクセス制御が正常に機能していれば、ログインページにリダイレクトされるので、今度はアクセスを許可した .NET ユーザー アカウントでログインし、目的のコンテンツが表示されるかを確認してください。
"役割" 単位でのアクセス制御の設定
IIS 7 に用意されている Web フォーム認証では、Windows におけるセキュリティグループのように、複数のユーザーアカウントとまとめた "役割" という機能を持っています。
この "役割" を使用したアクセス制御を行うには、まず "役割" を作成する必要があります。
今回は、イメージしやすいように "SiteAdmins" という、Web サイト管理者用の役割を作成し、Web サイト内の "adminTools" というディレクトリで、同役割に対してのみアクセスを許可する、というシナリオでその手順を紹介させていただきます。
"役割" の作成
"SiteAdmins" という "役割" を作成して、.NET ユーザーアカウントを "役割" に追加するには以下の手順で作業を行います。
IIS 管理ツールを起動
IIS 管理ツール画面左のツリービューを展開し、Web フォーム認証が適用されているサイトを選択
画面中央の [機能 ビュー] より、[.NET ユーザー] アイコンをダブルクリック
[.NET ユーザー] の設定画面が表示されるので、画面右の [操作] パネルより [役割] リンクをクリック
[.NET の役割] 画面が表示されるので、画面右の [操作] パネルより [追加] リンクをクリック
[.NET 役割を追加] ダイアログボックスが表示されるので、[名前] テキストボックスに "SiteAdmins" と入力して [OK] ボタンをクリック
IIS 管理ツール のウィンドウ左上端にある "戻るボタン" (IE についているのと同じもの) をクリックし、[.NET ユーザー] のリスト画面に戻る
アカウントリストから、作成した役割 "SiteAdmins" に追加する アカウントを選択し、画面右の [操作] パネルより [編集] リンクをクリック
[.NET ユーザーの編集] ダイアログボックスが表示されるので、 [役割] リストにある "SiteAdmins" にチェックをつけ [OK] ボタンをクリック
以上で、"役割" の作成と、"役割" への .NET ユーザーアカウントの追加は完了です。
"役割" によるアクセス権の設定
"役割" に対してディレクトリの設定方法は、前出の .NET ユーザーアカウントとほぼ同じです。
具体的な設定手順は以下のとおりです。
(※) 準備として Web サイト内に "adminTools" というディレクトリを作成し、検証に使用する createUser.aspx ファイルを配置しておいてください、
- IIS 管理ツールを起動
- IIS 管理ツール画面左のツリービューを展開し、Web フォーム認証が適用されているサイトの内の、目的のディレクトリを選択
- 画面中央の[機能ビュー] から[承認規則] アイコンをダブルクリックして[承認規則] の設定画面を表示
- [承認規則]のリストで、"すべてのユーザー" に対する "許可" の設定を選択し、画面右の [操作] パネルの [削除] リンクをクリックして削除
- [操作] パネルの [許可規則の追加] リンクをクリック
- [許可の承認規則の追加] ダイアログボックスが表示されるので、[役割またはユーザーグループの指定] オプションボタンにチェックをつけ、テキストボックスに作成した役割 "SiteAdmins" を入力
- [OK] ボタンをクリック
- [承認規則] のリストに、"匿名ユーザー" に対する "拒否" の設定があるか確認し、なければ画面右の [操作] パネルの [拒否規則の追加] リンクをクリックして "すべての匿名ユーザー" に対する拒否規則を追加
以上で "役割" に対するアクセス制御の設定は完了ですが、Web フォーム認証を適用した際に Web.conffig の <modules> に設定をしたのと同じく、静的なファイルに対してアクセス制御が有効になるように、簡単な"おまじない" が必要になります。
下位互換のために既定で設定されている RoleManager を削除し、あらためてアセンブリ System.Web.Security.RoleManagerModule で登録しなおすという作業です。
具体的には、Web.config ファイルの <system.webServer> の <modules> に以下の設定を追加します。
<remove name="RoleManager" /> <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> |
よって、Web フォーム認証が設定されているサイトの Web.config 内の <modules> の設定は、以下のようになります。
<modules> <remove name="FormsAuthentication" /> <remove name="RoleManager" /> <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /></modules> |
以上で "役割" を使用したディレクトリに対するアクセス権の設定は完了です。
検証のために、役割 siteAdmins に参加していない .NET ユーザーアカウントを使用して Web サイトにログインし、adminTools ディレクトリ内の createUser.aspx ファイルにアクセスしてください。
正しくアクセス制御機能が動作していれば、ログインページにリダイレクトされるので、今度は、役割 siteAdmins に参加している .NET ユーザーアカウントでログインを行ってください。
createUser.aspx が表示されれば OKです。
このように .NET ユーザーによる認証は、権限のスコープが Web サイト内で完結しているとはいえ、必要にして十分なアクセス制御機能を提供しています。
この認証方式は、IIS7 の管理サービスを使用した共有 Web ホスティングサービスでも、自由かつ、安全にユーザーに使用されることができる唯一のものです。
また、Windows においては、基本認証よりも安全で(※)、かつすべてのブラウザに対して使用可能ですので、基本認証を使用しなければならない明確な理由がない場合は、Web フォーム認証を検討してみるのも良いかもしれません。
※なにせコンピューターアカウントを作成する必要がないので。ただし、ASP.NET コードが動作するので、そのへんは心に留めておく必要があります。