ASP.NET のサイト マップ セキュリティ トリミング
更新 : 2007 年 11 月
Web サイトには、特定のページへのアクセスを一部のメンバまたはその他の認証されたユーザーだけに限定するというセキュリティ要件が指定されることがよくあります。ASP.NET ロール管理を使用すると、セキュリティ ロールに基づいて Web ファイルへのアクセスを制限できます。また、サイト マップ セキュリティ トリミングを使用すると、同じくセキュリティ ロールに基づいてサイト マップ内のナビゲート リンクを非表示にできます。ロール ベース セキュリティについては、「ロール管理について」を参照してください。
サイト マップ セキュリティ トリミングの動作
ASP.NET ページに次のナビゲーション構造が表示される場合を考えます。
Home
Products
Hardware
Software
Discounts
Services
Training
Consulting
Support
Customers というロールのメンバでないクライアントは、Support.aspx ページに設定されている ASP.NET アクセス規則により、Support Web ページを表示することを許可されないものとします。
ナビゲート表示の Support リンクを非表示にするには、Web.config ファイルで、セキュリティ トリミングを有効にするようにサイト マップ プロバイダを設定します。アプリケーションは、ASP.NET の URL 承認とファイル承認に従って Support ページへのリンクを非表示にするので、これ以外の変更は必要ありません。ASP.NET Version 2.0 に含まれる XmlSiteMapProvider コントロールは、URL 承認機能とファイル承認機能を使用して、各サイト マップ ノードに対する承認チェックを自動的に実行します。
Customers ロールのメンバでないクライアントに対して Support リンクを表示する場合は、Support.aspx ファイルのサイト マップ ノードの roles 属性を使用できます。roles 属性は、URL 承認とファイル承認によって与えられるアクセス レベルの範囲を超えてサイト マップ ノードへのアクセスを拡大します。
Support ページの roles 属性に Customers を設定するコード例を次に示します。セキュリティ トリミングを有効にしてから、この設定を行うと、URL 承認やファイル承認によってファイル自体の表示が許可されていない場合でも、Customers ロールに所属するユーザーに対して Support ページへのナビゲート リンクが表示されます。
<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
<!-- other <siteMapNode> elements -->
<siteMapNode title="Support" description="Support"
url="~/Customers/Support.aspx" roles="Customers" />
</siteMap>
Customers ロールのメンバでないユーザーには、URL 承認規則やファイル承認規則によって、Support ページを表示することを許可されないため、次のようなナビゲーション構造が表示されます。
Home
Products
Hardware
Software
Discounts
Services
Training
Consulting
セキュリティ トリミングの有効化
セキュリティ トリミングは、ASP.NET ロールと連携して動作します。そのため、セキュリティ トリミングを有効にするには、アクセス ルール (allow 要素と deny 要素) を使用してページを制限する必要があります。アクセス ルールの詳細については、「ロールを使用した承認の管理」を参照してください。
セキュリティ トリミングは、既定では無効になっており、プログラムから有効にすることはできません。セキュリティ トリミングは Web.config ファイルでしか設定できません。これは、SiteMapProvider クラスから継承されたカスタム クラスの場合も同じです。
セキュリティ トリミングを有効にするには、Web.config ファイルで siteMap 要素 (ASP.NET 設定スキーマ) 要素を設定する必要があります。サイト マップで既定の ASP.NET サイト マップ プロバイダを使用する場合、Web.config ファイルには、siteMap 要素 (ASP.NET 設定スキーマ) 要素が含まれていないことがあります。そのような場合には、この要素を追加する必要があります。既定のサイト マップ プロバイダを追加し、セキュリティ トリミングを有効にするコード例を次に示します。
<system.web>
<!-- …other configuration settings -->
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>
<add name="XmlSiteMapProvider"
description="Default SiteMap provider."
type="System.Web.XmlSiteMapProvider "
siteMapFile="Web.sitemap"
securityTrimmingEnabled="true" />
</providers>
</siteMap>
</system.web>
パフォーマンスに関する考慮事項
セキュリティ トリミング機能では、個々の要求のたびに URL 承認を使用して、siteMapNode 要素に対応する URL にユーザーがアクセスできるかどうかを判断します。承認を受けるノードの数によっては、この追加の処理によってパフォーマンスが低下することがあります。セキュリティ トリミングを有効にする場合は、次の方法によってパフォーマンスを改善できます。
サイト マップ ファイルのノード数を制限する 150 以上のノードがサイト マップ ファイルに含まれている場合は、セキュリティ トリミング操作の実行にかなりの時間がかかる可能性があります。
明示的に roles 属性を siteMapNode要素に設定する roles 属性にワイルドカード文字またはアスタリスク (*) を設定するのは、どのクライアントにも安全に表示できるノードだけに限定する必要があります 。roles 属性が存在すると、ユーザーがこの属性にリストされているロールのいずれかに所属する場合、ASP.NET は、siteMapNode に関連付けられている URL の URL 承認を省略できます。
意図しないトリミングを防止するためのロールの選択
子サイト マップ ノードの意図しないトリミングを防ぐために、承認規則とロール属性は慎重に設定する必要があります。ASP.NET ページに次のナビゲーション構造が表示される場合を考えます。
Home
Products
Hardware
Products.aspx ファイルに設定する URL 承認規則またはファイル承認規則は、Hardware.aspx ファイルに設定する承認規則ほど厳しくしません。前者を後者と同じくらい厳しくすると、Products への親リンクが非表示にされるため、Hardware リンクの表示が許可されるユーザーに対して Hardware リンクが表示されなくなります。非表示のリンクを公開するには、両方のサイト マップ ノードに roles 属性を追加します。この属性は、無視される ASP.NET ロールの一覧を示します。
サイト マップのルート ノードにはユーザー全員がアクセスできるようにすることをお勧めします。ルート ノードに全員がアクセスできるようにするには、次のコード例に示すように、roles 属性にワイルドカード文字としてアスタリスク (*) を設定します。
<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
<siteMapNode title="Home" description="Home"
url="default.aspx" roles="*">
<!-- other <siteMapNode> elements -->
</siteMapNode>
</siteMap>
サイト マップ内では、Web アプリケーション外部の URL を参照できます。アプリケーション外部の URL へのアクセスは、ASP.NET ではテストできません。そのため、セキュリティ トリミングを有効にした場合、ロール属性にアスタリスク (*) を設定しない限り、サイト マップ ノードが表示されなくなります。アスタリスクを使用すると、事前に URL へのアクセスをテストしなくても、すべてのクライアントがサイト マップ ノードを表示できるようになります。
複数のサイト マップまたはプロバイダでのセキュリティ トリミングの使用
複数のサイト マップを一緒に使用して、単一の Web サイトのナビゲーション構造を定義できます。たとえば、Web.sitemap ファイルは、分割して別個の複数のフォルダに配置できるという点で Web.config ファイルに似ています。
サイト マップは、親サイト マップの SiteMapNode オブジェクトの siteMapFile 属性または provider 属性に設定されている子サイト マップ ファイルやプロバイダを参照することで、相互にリンクできます。
別のサイト マップを参照するサイト マップ ノードを次のコード例に示します。
<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
<!-- other <siteMapNode> elements -->
<siteMapNode siteMapFile="~/Customers/Customers.sitemap"
securityTrimmingEnabled="true" />
</siteMap>
セキュリティ トリミングの影響を受ける API メンバ
ナビゲーション コントロールを使用すると、コードをほとんど使わずにページにサイト ナビゲーションを追加できますが、コードによってサイト ナビゲーションを操作することもできます。Web アプリケーションを実行すると、ASP.NET は、サイト マップ構造を表す SiteMap オブジェクトを公開します。SiteMap オブジェクトのメンバはすべて静的です。SiteMap オブジェクトは、マップ内の各ノードのプロパティを含む SiteMapNode オブジェクトのコレクションを公開します。その理由は、SiteMapPath コントロールを使用した場合、このコントロールは、SiteMap オブジェクトと SiteMapNode オブジェクトを使用して適切なリンクを自動的に表示するからです。
SiteMap、SiteMapNode、SiteMapProvider の各オブジェクトを独自のコードで使用すると、サイト マップ構造を走査したり、カスタム コントロールを作成してサイト マップ データを表示したりできます。サイト マップに書き込むことはできませんが、オブジェクトのインスタンスでサイト マップ ノードを変更することはできます。詳細については、「方法 : メモリ内のサイトマップ ノードをプログラムで変更する」または「方法 : サイトマップ ノードをコードによって列挙する」を参照してください。
ASP.NET は、既定のサイト マップ プロバイダである XmlSiteMapProvider を使用して Web.sitemap ファイルを読み取ります。サイト マップ ファイル以外の場所にサイト マップ情報を格納する場合は、独自のサイト マップ プロバイダを作成し、カスタム プロバイダを呼び出すようにアプリケーションを構成します。サイト マップ プロバイダは Web.config ファイルで設定されます。アプリケーションを実行すると、ASP.NET はプロバイダを呼び出し、必要に応じてサイト マップ情報を取得できます。この後、ASP.NET は、プロバイダが返した情報に基づいて SiteMapNode オブジェクトを作成し、設定します。このオブジェクトには、SiteMap クラスを使用してプログラムによってアクセスできます。詳細については、「ASP.NET サイトマップ プロバイダの実装」を参照してください。
セキュリティに関するメモ : |
---|
拡張子が .sitemap 以外のファイル名を持つファイルにサイト マップ データを格納するカスタム サイト マップ プロバイダを実装すると、セキュリティ上の問題が発生する可能性があります。既定では、ASP.NET は、.sitemap などの既知のファイル名拡張子を持つファイルがクライアントによってダウンロードされないように設定されています。データを保護するために、ファイル名の拡張子が .sitemap 以外のカスタム サイト マップ データ ファイルは App_Data フォルダに配置してください。詳細については、「ASP.NET のサイト ナビゲーションの保護」を参照してください。 |
セキュリティ トリミングを有効にすると、SiteMap、SiteMapNode、SiteMapNodeCollection の各クラスの一部のメンバの動作に影響が及びます。これらのクラスを使用すると、次のような動作が生じます。
サイト ナビゲーション API メンバは、表示するセキュリティ権限がユーザーに与えられていないサイト マップ ノードを参照しようとした場合、null を返します。たとえば、CurrentNode、NextSibling、ParentNode、および PreviousSibling の各プロパティは、制限されているサイト マップ ノードを返そうとした場合、null を返します。
サイト ナビゲーション API メンバがサイト マップ ノードのツリーを走査する必要がある場合、ユーザーが表示できないサイト マップ ノードはすべて走査から除外されます。たとえば、ChildNodes メソッドを実行すると、ノードのコレクションがフィルタ処理され、ユーザーが表示できるノードだけが含まれます。Clone メソッドや IsDescendantOf メソッドなど、ノード パスを追跡する必要がある API メンバの場合、パスは制限されたノードで終了します。これにより、複製操作では結果のノード数が減少する場合があります。また、ノードが構造的には要求されたノードの実際の子孫であっても、IsDescendantOf メソッドで false の値が返される場合があります。
表示するセキュリティ権限をユーザーが持たないルート ノードをサイト ナビゲーション API メンバが参照すると、InvalidOperationException 例外が返されます。ルート プロバイダのルート ノードだけには、ユーザー全員がアクセスできるようにする必要があります。これにより、最初に SiteMap オブジェクトを取得したときに例外がスローされなくなります。
SiteMapNode オブジェクトが誤って別のサイト マップ ファイルやプロバイダを参照すると、ConfigurationException 例外がスローされます。
メモ : |
---|
サイト マップ内では、Web アプリケーション外部の URL を参照できます。アプリケーション外部の URL へのアクセスは、ASP.NET ではテストできません。そのため、セキュリティ トリミングを有効にした場合、ロール属性にアスタリスク (*) を設定しない限り、サイト マップ ノードが表示されなくなります。アスタリスクを使用すると、事前に URL へのアクセスをテストしなくても、すべてのクライアントがサイト マップ ノードを表示できるようになります。 |
参照
処理手順
チュートリアル : セキュリティ ロールに基づくサイトマップ ノードのフィルタ処理