セキュリティ確認要求
特定のアクセス許可を与えられている呼び出し元だけがコードを呼び出せるようにするには、そのコードの呼び出し元に特定のアクセス許可またはアクセス許可セットが与えられていることを宣言的または強制的に要求します。このような要求 (確認要求) を行うと、呼び出し元のコードに対して強制的に制限を適用するためのセキュリティ チェックがランタイムによって実行されます。セキュリティ チェック時には、ランタイムがスタック ウォークを行い、コール スタック内のすべての呼び出し元のアクセス許可を調べて、要求されているアクセス許可が各呼び出し元に与えられているかどうかを確認します。要求されたアクセス許可が与えられていない呼び出し元が見つかった場合には、セキュリティ チェックが失敗し、SecurityException がスローされます。スタック ウォークを伴わない確認要求はリンク確認要求だけで、この場合は、直接の呼び出し元についてだけチェックが行われます。
セキュリティ チェックは、特定のメソッドが呼び出されたとき、またはコードの特定のブロックが実行される前に、必ず実行するように指定できます。特定のクラスのメンバが呼び出されたときにセキュリティ チェックを実行するようにする場合は、そのクラスの前に確認要求を配置し、クラスのすべてのメンバにその確認要求が適用されるようにします。以降では、必要に応じてセキュリティ確認要求を行う方法と、セキュリティ確認要求の種類を選択するときの基準について説明します。
保護されているリソースに直接アクセスするライブラリを作成する場合、そのような直接アクセスを呼び出し元に公開するには、そのライブラリでセキュリティ確認要求を実行して、コール スタック内のすべての呼び出し元がそのリソースへのアクセス許可を持っていることを検証できるようにする必要があります。確認要求は、宣言的または強制的に実行できます。クラス コンストラクタのコードは、特定の位置または特定のコンテキストで実行されるとは限らないため、クラス コンストラクタで確認要求を実行することは避ける必要があります。クラス コンストラクタのコール スタックの状態は完全には定義されないため、クラス コンストラクタで確認要求を実行すると、予期しない、望ましくない結果が生じる可能性があります。
実行する確認要求の種類にかかわらず、次のガイドラインに従う必要があります。
呼び出し元に特定の ID アクセス許可が与えられていることを要求することによって、特定のサイトまたはゾーンを発生元としているか、特定の発行元によって署名されている呼び出し元だけがコードを呼び出すことができるようにします。ただし、このような要求は、ID が一致するかどうかに基づいてアクセスを拒否する場合ではなく、ID の一致に基づいて追加のアクセス権を与える場合にだけ行うようにします。コードの ID を変更またはマスクすることは比較的簡単なため、ID だけに基づいてアクセスを拒否するのは、承認されていないアクセスからコードやそのコードがアクセスするリソースを保護する方法としては十分ではありません。
オブジェクトのクラス レベルに確認要求を配置することによって、特定のアクセス許可を持っている呼び出し元だけがそのオブジェクトを作成できるようにします。たとえば、FileStream クラスから派生した
myFileStream
というクラスがあり、適切な権限を与えられた呼び出し元だけがmyFileStream
のインスタンスを生成できるようにするとします。そのためには、myFileStream
によって生成されたストリームへのアクセス権を表す FileIOPermission オブジェクトを要求する宣言的な確認要求を、myFileStream
クラスのクラス レベルに配置します。確認要求は、プロパティを設定または取得するコード内に配置することもできます。一般に、プロパティにパスワードなどの機密情報が保持されていない限り、比較的制限の少ないアクセス許可に対する確認要求は、set アクセサではなく get アクセサに配置します。
メモ : ロール ベース セキュリティでのチェックは、コード アクセス セキュリティでのチェックとはセマンティクスがわずかに異なります。詳細については、「ロール ベース セキュリティ」を参照してください。
メモ : 確認要求を適用することができるレベルは、クラス、メソッド、イベントおよびプロパティだけです。アセンブリや、プライベートではないメンバ変数は、確認要求で保護されません。アセンブリ レベルや非プライベート変数レベルに配置された確認要求では、コンパイラの警告は発生しませんしたがって、確認要求が提供する保護を確実に実行するには、パブリック メンバの代わりにプロパティを使用することが重要です。