解説インサイド .NET Framework第12回 コード・アクセス・セキュリティ(その4 前編) インフォテリア株式会社 |
始めに
今回はアクセス許可を取り上げて、それが実際に適用されるタイミングと、そのタイミングを開発者がコントロールする方法を解説する。.NET Frameworkであらかじめ提供されているアクセス許可は、前回(その3)で一覧したので、それを参考にしてほしい。
アクセス許可が適用されるタイミング
前回一覧したアクセス許可の中に、System.Data.SqlClient.SqlClientPermissionというアクセス許可があった。名前から想像できるとおり、このアクセス許可はSystem.Data.SqlClient名前空間のクラスを使って、SQL Serverにアクセスできるかどうかを制御するためのものだ。それでは、このアクセス許可はいつ適用され、アクセス可能かどうかの判断が行われるのだろうか。
試しに、次のようなコードを実行してみよう。まず、SqlClient名前空間のクラスを使ってSQL Serverにアクセスするアセンブリを作成する(データベースのユーザー名とパスワードに注意)。
|
|
SQL Serverにアクセスするサンプル・プログラムDBAccess.cs | |
(コンパイル方法はcsc /t:library DBAccess.cs)
|
次に、このクラスを利用するアプリケーションを作成する。
|
|
DBAccess.csのクラスを利用するサンプル・プログラムPermTest.cs | |
(コンパイル方法はcsc /r:DBAccess.dll PermTest.cs)
|
2つのコードをそれぞれコンパイルしてDLLファイルとEXEファイルにしたら、すでに解説した方法でDBAccessアセンブリがイントラネット・ゾーンからロードされるように、構成ファイル「PermTest.exe.config」を書く(publicKeyTokenやhrefの内容は環境によって異なるので注意)。
|
|
DBAccess.dllをイントラネット・ゾーンからロードするための構成ファイルPermTest.exe.config |
出来上がったらPermTest.exeを実行してみよう。次のようなエラーになるはずだ。
|
|
PermTest.exeの実行時に発生するエラー |
CodeAccessPermission.Demand
上記の例では、SqlConnectionクラスのOpenメソッドの実行時に例外が発生している。例外はSecurityExceptionで、具体的にはSqlClientPermissionアクセス許可が与えられなかったということだ。前回見たとおり、LocalIntranet_Zoneコード・グループに割り当てられているLocalIntranetアクセス許可セットには、SqlClientPermissionが含まれていない。そのため、このアクセス許可セットが適用されたDBAccessアセンブリは、コードの実行ができなかったというわけだ。このように、.NET Frameworkクラス・ライブラリ(FCL)の各クラスには、それが利用するリソースへのアクセス許可をチェックするコードがすでに埋め込まれている。例えば、System.IO.FileStreamクラスのコンストラクタでは、System.Security.Permissions.FileIOPermissionアクセス許可のチェックが行われているし、System.Net.DnsクラスのResolveメソッドの内部では、System.Net.DnsPermissionアクセス許可のチェックが行われている。それでは、埋め込まれているコードとはどんなものだろうか。
.NET Frameworkでは、すべてのアクセス許可はオブジェクトとして実体化できる。例えば、「SQL Serverデータベースにアクセスできる」というアクセス許可自体をオブジェクトとして扱っているのだ。具体的には、次のようにSqlClientPermissionクラスをインスタンス化すれば、アクセス許可を表すオブジェクトが作成される。
SqlClientPermission perm = new SqlClientPermission(
ここで注意しなければならないのは、アクセス許可のオブジェクトを作っても、アクセスが許可されるわけではないということだ。アクセス許可のオブジェクトはあくまでもアクセス許可の状態を表しているだけで、それが適用されるかどうかは作成しただけでは分からない。オブジェクトが示すアクセス許可を要求し、実際に許可を得るためには、次のようにDemandメソッドを呼び出す必要がある。
perm.Demand();
Demandメソッドは、System.Security.CodeAccessPermissionクラスのメソッドだ。Demandメソッドを呼び出すと、共通言語ランタイム(CLR)があらかじめポリシーから取得したアクセス許可セットを参照し、要求されたアクセス許可が含まれているかどうかをチェックする。含まれていれば何も起こらずに先に進み、含まれていなければSecurityExceptionが発生する。実は、FCLのそれぞれのクラスで内部的に行われているのも、すべてDemandメソッドの呼び出しである。
INDEX | ||
解説 インサイド .NET Framework | ||
第12回 コード・アクセス・セキュリティ(その4 前編) | ||
1.アクセス許可が適用されるタイミング | ||
2.Demandメソッドの内部動作 | ||
3.属性によるアクセス許可チェックの指定 | ||
「解説:インサイド .NET Framework 」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|