アクセス許可

共通言語ランタイムでは、コードが実行できる操作を、実行するためのアクセス許可をそのコードが持つ操作だけに限定します。 ランタイムはアクセス許可と呼ばれるオブジェクトを使用して、マネージ コードに制限を課します。 ランタイムは、いくつかの名前空間の中に組み込み許可クラスを用意するほか、カスタムのアクセス許可クラスのデザインおよび実装をサポートします。

アクセス許可には次の 2 種類があり、それぞれ固有の目的を持ちます。

  • コード アクセス許可は、保護されているリソースにアクセスしたり、保護された操作を実行できることを表します。

  • ロール ベース セキュリティ アクセス許可は、ユーザー (またはユーザーの代わりとなるエージェント) が特定の ID を持っているかどうか、または指定されたロールのメンバーであるかどうかを確認するための機構を提供します。 PrincipalPermission は、唯一のロール ベース セキュリティ アクセス許可です。

セキュリティ アクセス許可は、アクセス許可クラスの形式か (強制セキュリティ)、アクセス許可クラスを表す属性の形式で指定することができます (宣言セキュリティ)。 セキュリティ アクセス許可の基本クラスは System.Security.CodeAccessPermission、セキュリティ アクセス許可属性の基本クラスは System.Security.Permissions.CodeAccessSecurityAttribute です。

アセンブリの形式のアプリケーションには、アプリケーション ドメインに読み込まれるときに一連のアクセス許可が付与されます。 この付与は、通常、SecurityManager.GetStandardSandbox メソッドによって決定される定義済みのアクセス許可セットを使用して行われます。 許可セットにより、コードが利用できるアクセス許可が決まります。 ランタイムは、コードの生成場所 (ローカル コンピューター、ローカル イントラネット、インターネットなど) に基づいてアクセス許可を与えます。 コードがサンドボックスに読み込まれる場合は、コードに特別なアクセス許可を付与することもできます。 サンドボックスでのコードの実行の詳細については、「方法 : サンドボックスで部分信頼コードを実行する」を参照してください。

アクセス許可の主な用途は次のとおりです。

  • ライブラリ コードは、呼び出し元が特定のアクセス許可を持つことを要求できます。 コードにアクセス許可に対する Demand を配置すると、そのコードを使用するすべてのコードは、実行するときにそのアクセス許可が必要になります。 Demand は、呼び出し元が特定のリソースへのアクセスを有するかどうかを判断したり、呼び出し元の ID を調査したりするために使用できます。

  • コードでは、アクセス許可を使用して、保護するリソースへのアクセスを拒否できます。 SecurityAction.PermitOnly を使用すると、制限されたアクセス許可セットを指定して、他のすべてのアクセス許可を暗黙的に拒否できます。 ただし、意図的な悪用を防ぐ目的で PermitOnly を使用してアクセスを禁止することはお勧めしません。 暗黙的に拒否されたアクセス許可を許可セット内に有する、呼び出されたアセンブリは、使用するアクセス許可に対して SecurityAction.Assert を実行することにより、拒否されたアクセス許可をオーバーライドできます。 たとえば、UIPermission のみを許可し、本来 FileIOPermission を持つアセンブリを呼び出した場合、アセンブリは FileIOPermission に対して Assert を実行するだけで、ファイル操作を実行できるようになります。 参照されたアセンブリ内の信頼できないコードからリソースを安全に保護する唯一の方法は、そのコードを、それらのアクセス許可を含まない許可セットにより実行することです。

参照

概念

コード アクセス許可

ロール ベース セキュリティ アクセス許可

その他の技術情報

セキュリティの基本概念