ASP.NET で 承認 (Authorization) を 制御する 方法

0 件のコメント

最近の Webアプリケーション であれば ユーザー認証 を必要とするサイトが普通かと思います。 ユーザー認証の仕組みを作るのと同じように必要となるのがコンテンツに対するアクセス制御です。 ここでは コンテンツに対するアクセス制御 の具体的な実装例をまとめます。

目次

概要

ユーザー認証が終わると、続いてコンテンツにアクセスして良いかどうかの判断(承認)が行われます。 以下では承認の方法別メリット・デメリットおよび一般的な実装概念について述べます。

手法別メリット・デメリット

具体的なアクセス制御方法ですが、ASP.NET の 承認制御 は 「web.config を用いた方法」 と 「ソースコードに属性として記述する方法」 の2パターンがあります。 それぞれのメリット、デメリットをまとめると以下のようになるかと思います。

  • web.config を用いた方法
    メリット
    ソースコード修正なしにアクセス制御の変更が可能な点
    デメリット
    静的コンテンツを含めてあらゆるコンテンツについて制御を考える必要がある点
  • ソースコードに属性として記述する方法
    メリット
    アクセス可否判定の実装がロジックのみになるので理解しやすい点
    デメリット
    アクセス制御の変更をしようとするとコンパイルを伴う点

ホワイトリスト形式、ブラックリスト形式

一般的概念の話となりますが、アクセス制御を実装する際の考え方として 「ホワイトリスト形式」 と 「ブラックリスト形式」 があるかと思います。 それぞれ具体的には以下のような制御方法になります。

ホワイトリスト形式
匿名ユーザーからのアクセスを基本的に拒否として許可するコンテンツをリストアップする方法。 コンテンツのほとんどが会員向けである場合、ホワイトリスト形式が良いと思います。
ブラックリスト形式
匿名ユーザーからのアクセスを基本的に許可してアクセスできないコンテンツをリストアップする方法。

web.config で 制御する 方法

web.config で制御する場合、 location 要素と組み合わせることで実現できます。 ホワイトリスト形式で行うのかブラックリスト形式で行くのかで記載は異なりますが、ここではホワイトリスト形式での設定方法を記載します。 ホワイトリスト形式なので、基本的にはアクセス遮断でアクセス許可するコンテンツをリストアップする記載方法になります。

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- ルート設定(基本設定) -->
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="/Account/Login" />
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>

  <!-- 静的コンテンツのアクセス許可 -->
  <location allowOverride="true" path="Content">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <!-- ログインページのアクセス許可 -->
  <location allowOverride="true" path="Account/Login">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <!-- Public配下はアクセス許可 -->
  <location allowOverride="true" path="Public">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

location要素 配下にない 13行目 の allow要素 はこの web.config が配置されているディレクトリ配下に対する設定を示しています。 この指定がデフォルト指定になります。 個別に許可するディレクトリ、パス、ファイルは location要素 を利用して設定していきます。

authorization要素 の 子要素 に指定している allow要素 について、users でよく使う指定には以下の2パターンがあります。

<allow users="*"/>
anonymouse (誰でも) 許可。認証していないユーザーもアクセス可能。
<allow users="?"/>
ユーザー認証されたユーザーのみアクセス許可。

属性 で 制御する 方法

前述の web.config での制御と同様に認証は フォーム認証 としています(以下の web.config 参照)。 承認はソースコード上の属性 AuthorizeAttributeAllowAnonymousAttribute を用いて行います。 サンプルとして ASP.NET MVC のコントローラでの実装例を以下に載せます。

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="/Account/Login" />
    </authentication>
  </system.web>
</configuration>

SearchController.cs

namespace WebApplication1.Controllers
{
    using System.Web.Mvc;

    [Authorize]
    public class SearchController : Controller
    {
        // GET: Search
        [HttpGet]
        [AllowAnonymous]
        public ActionResult Index()
        {
            return this.View();
        }

        // POST: Search
        [HttpPost]
        public ActionResult Index(string key)
        {
            return this.View();
        }
    }
}

基本的に匿名ユーザーからのアクセスを拒否したいため、クラスに対して Authorize を指定して認証が必要であることを示します (5行目) 。 匿名ユーザーでも利用できる処理(サンプルコード上では GET: Search/Index)については AllowAnonymous を指定してアクセス許可します (10行目)。