アクセス許可の要求

更新 : 2007 年 11 月

アクセス許可の要求とは、コードに許可する必要がある権限をランタイムに知らせるための方法です。アセンブリに必要なアクセス許可を要求するには、コードのアセンブリ スコープに属性 (宣言構文) を配置します。アセンブリが作成されると、言語コンパイラは要求されたアクセス許可をアセンブリ マニフェストに格納します。読み込み時には、ランタイムによってアクセス許可要求がチェックされ、アセンブリに与えるアクセス許可を判断するためにセキュリティ ポリシー規則が適用されます。要求に応じて、ランタイムがコードにアクセス許可を与えることを拒否することはありますが、より多くのアクセス許可をコードに与えるようになることはありません。コードに与えられるアクセス許可の上限は、最終的には常にローカルの管理ポリシーによって決定されます。

コードをコンパイルするためだけなら、そのコードのアクセス許可を要求する必要はありませんが、次に示す重要な理由から、アクセス許可要求は常に行う必要があります。

  • アクセス許可を要求することによって、コードの実行が許可された場合に、そのコードを正しく実行できる可能性が高まります。最小限のアクセス許可セットを要求するコードは、それらのアクセス許可を与えられない限り、実行されません。コードに最低限必要なアクセス許可セットを指定しない場合は、そのコードは、一部のアクセス許可が与えられないことが原因で正常実行できないという、あらゆる事態に対処できることが必要になります。

  • アクセス許可を要求することによって、コードに必要なアクセス許可だけを与えることができます。コードが悪意のあるコードに利用されたり、リソースに損害を与える可能性のあるバグを含んでいたりする場合でも、コードに必要以上のアクセス許可を与えないことにより、そのコードが他のアクセス許可によって保護されているリソースに損害を与えることがなくなります。要求するアクセス許可はコードが必要とするアクセス許可だけに限る必要があります。

  • アクセス許可を要求することによって、管理者が、アプリケーションが必要とする最低限のアクセス許可を把握し、それに応じてセキュリティ ポリシーを修正できるようになります。管理者は Permission View ツール (Permview.exe) を使用して、要求されたアクセス許可を与えるためにアセンブリを調べたり、セキュリティ ポリシーを設定したりできます。アプリケーションに必要なアクセス許可を明示的に要求しないと、Permission View ツールは、アプリケーションが必要とするアクセス許可について何の情報も返すことができません。管理者がこの情報を入手できないと、アプリケーションの管理は難しくなります。

アクセス許可を要求することによって、アプリケーションが機能するために必要なアクセス許可、またはアプリケーションが特に必要としないアクセス許可について、ランタイムに通知できます。たとえば、ローカルのハード ディスクに分離ストレージを使用せずに書き込みを行うアプリケーションには、FileIOPermission が必要です。このアプリケーションのコードが FileIOPermission を要求せず、ローカルのセキュリティ設定がそのアプリケーションにこのアクセス許可を与えないように設定されている場合、アプリケーションがディスクに書き込もうとすると、セキュリティ例外が発生します。アプリケーションがその例外を処理できる場合でも、ディスクへの書き込みは許可されません。この動作は、そのアプリケーションがテキスト編集プログラムで、ユーザーが長期間使用するような場合には、ユーザーにとって不満の種となる可能性があります。一方、アプリケーションが FileIOPermission を要求したにもかかわらず、ローカルのセキュリティ設定がそのアプリケーションに FileIOPermission を与えない場合には、アプリケーションが起動時に例外を生成するため、ユーザーが行った作業が失われるということはありません。また、アプリケーションが FileIOPermission を要求し、さらに信頼されている場合には、管理者はそのアプリケーションをリモート共有から実行できるように、セキュリティ ポリシーを調整できます。

コードが保護されているリソースにアクセスしない場合や、保護されている操作を実行しない場合には、アクセス許可を要求する必要はありません。たとえば、コードがリソースを使用せずに、渡された入力に基づいて結果を計算するだけの場合、通常はアクセス許可を要求する必要はありません。保護されているリソースにアクセスするけれども必要なアクセス許可を要求しないコードは、実行することはできますが、実行中に、対応するアクセス許可を持っていないリソースにアクセスしようとした時点でエラーが発生する可能性があります。

アクセス許可を要求するには、コードが使用するリソースや保護されている操作を確認したうえで、それらのリソースや操作を保護しているアクセス許可を確認しておく必要もあります。さらに、コンポーネントによって呼び出されるクラス ライブラリ メソッドがアクセスするリソースについても把握しておく必要があります。.NET Framework に組み込まれているコード アクセス許可の一覧については、アクセス許可のトピックを参照してください。

アクセス許可要求の種類を次の表で説明します。

アクセス許可要求

説明

最低限のアクセス許可 (RequestMinimum)

コードを実行するために必要なアクセス許可。

オプションのアクセス許可 (RequestOptional)

コードを実行するためだけなら不要だが、コードが使用することもできるアクセス許可。この要求は、特別に要求されていないその他のすべての要求を暗黙に拒否します。

拒否するアクセス許可 (RequestRefuse)

セキュリティ ポリシーで許可されている場合でも、コードには与えないアクセス許可。

上の要求のいずれかを組み込みアクセス許可セットに対して実行 (「組み込みアクセス許可セットの要求」を参照)

NothingExecutionFullTrustInternetLocalIntranetSkipVerification などの組み込みアクセス許可セット。

上の要求のいずれかを XML エンコード済みアクセス許可セットに対して実行 (「XML でエンコードされたアクセス許可の要求」を参照)

必要なアクセス許可セットの XML 表現 (XML でエンコードされたアクセス許可セットを含む文字列か、またはエンコード済みのアクセス許可を含む XML ファイルの場所)。

RequestMinimum を使用して必要なアクセス許可を指定すると、コードにはセキュリティ ポリシーが許可する範囲で、要求した各アクセス許可が与えられます。コードは、要求したアクセス許可がすべて与えられた場合にだけ実行できます。

必要なアクセス許可を要求せずに、オプションのアクセス許可だけを要求すると、場合によってはアセンブリに与えられるアクセス許可が厳しく制限される可能性があります。たとえば、セキュリティ ポリシーは、アセンブリ A に対して通常は名前付きアクセス許可セット Everything に関連付けられているアクセス許可を与えるとします。アセンブリ A の開発者がアクセス許可 A をオプションとして要求し、必要なアクセス許可を要求しなかった場合、アセンブリ A にはアクセス許可 A が与えられる (セキュリティ ポリシーによって許可された場合) か、または一切のアクセス許可が与えられません。

参照

処理手順

方法 : 名前付きアクセス許可セットに対するアクセス許可を要求する

概念

コード アクセス セキュリティの基礎

アセンブリ マニフェスト

アクセス許可

XML でエンコードされたアクセス許可の要求

セキュリティ ポリシー

参照

FileIOPermission

SecurityAction.RequestMinimum

SecurityAction.RequestOptional

RequestRefuse

その他の技術情報

コード アクセス セキュリティ