次の方法で共有


セキュリティ チェックのオーバーライド

通常、セキュリティ チェックでは、コール スタック内のすべての呼び出し元について、指定したアクセス許可が与えられているかどうかがチェックされます。しかし、個々のアクセス許可オブジェクトやアクセス許可セット オブジェクトに対して AssertDeny、または PermitOnly を呼び出すことによって、セキュリティ チェックの動作をオーバーライドできます。これらのメソッドのどれを呼び出すかに応じて、コール スタック内のすべての呼び出し元のアクセス許可に関するチェックが完了していない場合でも、セキュリティ チェックを成功または失敗させることが可能です。

あるメソッドが別のメソッドを呼び出すたびに、呼び出されるメソッドについての情報を格納するための新しいフレームがコール スタック上に生成されます。このコンテキストでは、コンストラクタの使用およびプロパティへのアクセスはメソッド呼び出しと見なされます。各スタック フレームには、メソッドが AssertDeny、または PermitOnly に対して行ったすべての呼び出しについての情報も含まれます。呼び出し元が同じメソッド呼び出しで AssertDeny、または PermitOnly を 2 回以上使用すると、ランタイムは次の処理規則を適用します。この規則は、オーバーライドの動作に影響を与える可能性があります。

  • スタック ウォークの実行時に、1 つのスタック フレームで同じ型に対する 2 回以上のオーバーライド (つまり Assert に対する 2 回の呼び出し) が検出された場合は、2 回目のオーバーライドで例外がスローされます。

  • 同じスタック フレームで異なる複数のオーバーライドが検出された場合には、ランタイムはこれらのオーバーライドを PermitOnlyDenyAssert の順序で処理します。

オーバーライドを置き換えるには、まず適切な復帰メソッド (たとえば RevertAssert) を選択してから、新しいオーバーライドを適用します。

Noteメモ :

クラス コンストラクタのコードは、特定の位置または特定のコンテキストで実行されるとは限らないため、クラス コンストラクタでスタック ウォークのオーバーライドを行うことは避ける必要があります。クラス コンストラクタのコール スタックの状態は完全には定義されないため、コンストラクタでスタック ウォークのオーバーライドを実行すると、予期しない、望ましくない結果が生じる可能性があります。

アプリケーションの開発者は、通常は AssertDeny、または PermitOnly を使用する必要はありません。コンポーネントやクラス ライブラリの開発者も、これらを使用する機会はほとんどありません。ただし、セキュリティのオーバーライドを行った方が適切な場合もあります。詳細については、AssertDenyPermitOnly の各トピックを参照してください。

Noteメモ :

オーバーライド (DenyAssert、または PermitOnly) を実行する場合は、同じスタック フレーム (つまり、メソッド) で同じ種類のオーバーライドを実行する前に、アクセス許可を元に戻す必要があります。アクセス許可を元に戻さないと、SecurityException がスローされます。たとえば、アクセス許可 P を拒否した場合は、同じメソッドで別のアクセス許可 Q を拒否する前に、前のアクセス許可を元に戻す必要があります。

オーバーライドを元に戻す静的メソッドを次の表に示します。

メソッド メソッドのアクション

CodeAccessPermission.RevertAll

現在のフレームにおける以前のすべてのオーバーライドが削除され、その効力がなくなります。

CodeAccessPermission.RevertAssert

現在のフレームにおける以前のどの Assert も削除され、その効力がなくなります。

CodeAccessPermission.RevertDeny

現在のフレームにおける以前のどの Deny も削除され、その効力がなくなります。

CodeAccessPermission.RevertPermitOnly

現在のフレームにおける以前のどの PermitOnly も削除され、その効力がなくなります。

参照

関連項目

Using the Assert Method
Using the Deny Method
Using the PermitOnly Method

概念

安全なクラス ライブラリの作成

その他の技術情報

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