.NET TIPS

[ASP.NET]ナビゲーション・コントロールでセキュリティ・トリミング機能を有効にするには?[2.0のみ、C#、VB]

山田 祥寛
2006/10/20

 セキュリティ・トリミング機能とは、カレント・ユーザーのロールに応じてナビゲーション・コントロール上のメニュー項目を動的にトリミングする(=非表示にする)機能のことだ。

 例えば、管理者ユーザーにしかアクセスできないメニュー項目を、(アクセス自体は拒否されるにせよ)メニュー上に表示しておくことは、ユーザビリティの観点からはもちろん、セキュリティという観点からも好ましくない(悪意ある攻撃者にとっては、そこに保護されたページが「存在する」ということそのものが攻撃の手掛かりとなるからだ)。

 しかし、セキュリティ・トリミング機能を有効にすることで、管理者メニューを管理者以外のユーザーに対して非表示にすることが可能になる。

 次の画面例は、セキュリティ・トリミングが無効な状態のWebページをログインしていないユーザー(以下、未ログイン・ユーザー)が参照したときのものだ。管理者専用メニュー「サイト管理」が表示されているが、アクセスはできない。

セキュリティ・トリミング機能を無効にしたとき(未ログイン・ユーザーで表示)
管理者専用メニュー「サイト管理」も表示される(アクセスは不可)。

 これがセキュリティ・トリミングを有効にした状態では次のような画面となる。管理者専用メニュー「サイト管理」は表示されない。

セキュリティ・トリミング機能を有効にしたとき(未ログイン・ユーザーで表示)
管理者専用メニュー「サイト管理」は表示されない。

 もちろん、セキュリティ・トリミングを有効にした状態のWebページを、ログイン・ユーザーが参照した場合には「サイト管理」の項目が表示され、それにアクセスできなければならない。

 それではさっそく、セキュリティ・トリミング機能を有効にする手順を見ていこう。

1. サイトマップ・ファイルを用意する

 まずセキュリティ・トリミング機能の対象となるサイトマップ・ファイルを用意する。セキュリティ・トリミング機能を利用する場合も、サイトマップ・ファイルの側で特別に意識することはない。通常どおりの構文で、サイトマップ情報を記述すればよい。

 サイトマップ・ファイルの記述方法については、「TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?」が詳しいので、併せてこちらも参照してほしい。

<?xml version="1.0" encoding="UTF-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="ホーム"
    description="トップページ" url="default.aspx">
    <siteMapNode title="新刊書籍情報"
        description="サーバサイド技術に関する書籍の最新情報" url="books.aspx">
      <siteMapNode title="改訂新版 基礎PHP"
        description="PHP 5.0を基礎から学ぶのに最適" url="kisop.aspx" />
      <siteMapNode title="独習ASP.NET"
          description="ASP.NETを独りで学ぶ 入門書の定番" url="aspnet.aspx" />
    </siteMapNode>
    <siteMapNode title="サイト管理"
      description="管理者専用ページ" url="~/Auth/Auth.aspx" />
  </siteMapNode>
</siteMap>
本稿のサンプル・アプリケーションで使用するサイトマップ・ファイル(Web.sitemap)

 なお、本サンプル・アプリケーションでは、「サイト管理」メニューには“admin”ロールを持ったユーザーしかアクセスできないものとする。「サイト管理」メニュー(~/Auth/Auth.aspx)に対しては、あらかじめ「ASP.NET Webアプリケーション管理ツール」(以降、管理ツール)上で“admin”ユーザーに対してのみアクセスを許可するように設定しておく必要がある。

 管理ツールの詳細な使い方については、「TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?」を参考にしていただきたい。

2. セキュリティ・トリミング機能を有効化する

 セキュリティ・トリミング機能を有効にするには、アプリケーション構成ファイル(Web.config)に対して、トリミング機能に対応したサイトマップ・プロバイダ(サイトマップ情報にアクセスするためのクラス)を追加する必要がある。次の設定はその例だ。

<?xml version="1.0" ?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.web>
  ……中略……
    <siteMap defaultProvider="TrimSiteMapProvider" enabled="true">
      <providers>
        <add name="TrimSiteMapProvider" securityTrimmingEnabled="true"
          type="System.Web.XmlSiteMapProvider" siteMapFile="Web.sitemap" />
    </providers>
  </siteMap>
  ……中略……
  </system.web>
</configuration>
セキュリティ・トリミング機能を有効化するアプリケーション構成ファイル(Web.config)

 サイトマップ・プロバイダを登録するのは、<siteMap>/<providers>/<add>要素の役割だ。<add>要素の基本的な属性については、「TIPS:[ASP.NET]サイト内に複数のサイトマップ・ファイルを設置するには?」を参照していただくとして、ここで注目いただきたいのは、securityTrimmingEnabled属性だ。この属性をtrueに設定するだけで、サイトマップ・プロバイダのセキュリティ・トリミング機能を有効にすることができる。

 また、ここでは<siteMap>要素のdefaultProvider属性として追加したプロバイダ名(XmlSiteMapProvider)を併せて指定しておこう(defaultProvider属性は省略可能であるが、その場合、利用の都度にプロバイダ名を明記する必要があるので注意すること)。

 以上でセキュリティ・トリミングの設定は完了だ。上記の内容を理解したら、.aspxファイルにTreeView/Menu/SiteMapPathなどのナビゲーション・コントロールを配置して、“admin”ユーザー、未ログイン・ユーザーでそれぞれアクセスしてみよう(ナビゲーション・コントロールの利用方法については、前掲の「TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?」が詳しいので、そちらをご参照いただきたい)。未ログイン・ユーザー(あるいは、“admin”ユーザー以外)でアクセスした場合に、「サイト管理」メニューが正しくトリミングされていれば成功だ。

大規模サイトマップでパフォーマンスを低下させないための施策

 このように、セキュリティ・トリミング機能はアプリケーション構成ファイル(Web.config)に定義を追加するだけで簡単に利用できるが、サイト規模が大きくなった場合には注意が必要だ。

 というのも、セキュリティ・トリミング機能では、リクエストの都度、URL承認を使用して該当のメニュー項目へのアクセス可否を判定する。URL承認はオーバーヘッドの大きい処理なので、サイトマップの規模によっては、パフォーマンスが低下する原因になるのだ。サイト規模が大きい場合には、以下のような施策をあらかじめ検討することをお勧めしたい。

(1)サイトマップ・ファイルに含まれるメニュー項目を制限する

 おおよそ150以上のメニュー項目がサイトマップ・ファイルに含まれる場合、パフォーマンス低下の原因となる場合がある。サイトマップ・ファイルを複数に分割し、リクエストURLによって切り替えるなどの対処を検討するとよい(複数のサイトマップ・ファイルを利用する方法については、「TIPS:[ASP.NET]サイト内に複数のサイトマップ・ファイルを設置するには?」を参照)。

(2)サイトマップ・ファイルにroles属性を明示する

 例えば、本サンプルの例ならば、以下のように書き換えることができる。

<?xml version="1.0" encoding="UTF-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="ホーム"
    description="トップページ" url="default.aspx"
    roles="*">
    <siteMapNode title="新刊書籍情報"
        description="サーバサイド技術に関する書籍の最新情報" url="books.aspx"
        roles="*">
      <siteMapNode title="改訂新版 基礎PHP"
        description="PHP 5.0を基礎から学ぶのに最適" url="kisop.aspx"
        roles="*" />
      <siteMapNode title="独習ASP.NET"
          description="ASP.NETを独りで学ぶ 入門書の定番" url="aspnet.aspx"
          roles="*" />
    </siteMapNode>
    <siteMapNode title="サイト管理"
      description="管理者専用ページ" url="~/Auth/Auth.aspx"
      roles="admin" />
  </siteMapNode>
</siteMap>
roles属性を追記したサイトマップ・ファイル(Web.sitemap)

 roles属性が指定されており、かつ、カレント・ユーザーがこの属性で指定されているロール(リスト)のいずれかに所属している場合、ASP.NETは該当項目のURL承認をスキップできる。ちなみに、roles属性にアスタリスク(*)が指定されている場合、ASP.NETは無条件にすべてのユーザーに対して該当メニュー項目を表示する。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:セキュリティ
使用キーワード:<urlMapping>要素
使用キーワード:<add>要素
関連TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?
関連TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?
関連TIPS:[ASP.NET]サイト内に複数のサイトマップ・ファイルを設置するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]サイト内に複数のサイトマップ・ファイルを設置するには?
[ASP.NET]サイトマップ・ファイルをローカライズするには?
[ASP.NET]サイトマップ・データを非階層コントロールに表示するには?
[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?
[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間