セキュリティ チェックのオーバーライド
通常、セキュリティ チェックでは、コール スタック内のすべての呼び出し元について、指定したアクセス許可が与えられているかどうかがチェックされます。 ただし、個々のアクセス許可オブジェクトやアクセス許可セット オブジェクトの Assert、Deny、または PermitOnly を呼び出すことで、セキュリティ チェックの動作をオーバーライドできます。 これらのメソッドのどれを呼び出すかに応じて、コール スタック内のすべての呼び出し元のアクセス許可に関するチェックが完了していない場合でも、セキュリティ チェックを成功または失敗させることが可能です。
重要 |
---|
.NET Framework Version 4 では、Deny アクセス許可要求および RevertDeny アクセス許可要求を適用するためのランタイム サポートは削除されています。これらの要求は、.NET Framework 4 以降に基づくコードで使用しないでください。この変更およびその他の変更の詳細については、「.NET Framework 4 におけるセキュリティの変更点」を参照してください。 |
あるメソッドが別のメソッドを呼び出すたびに、呼び出されるメソッドについての情報を格納するための新しいフレームがコール スタック上に生成されます。 このコンテキストでは、コンストラクターの使用およびプロパティへのアクセスはメソッド呼び出しと見なされます。 各スタック フレームには、メソッドが Assert、Deny、または PermitOnly に対して行ったすべての呼び出しについての情報も含まれます。 呼び出し元が同じメソッド呼び出しで Assert、Deny、または PermitOnly を 2 回以上使用すると、ランタイムは次の処理規則を適用します。この規則は、オーバーライドの動作に影響を与える可能性があります。
スタック ウォークの実行時に、1 つのスタック フレームで同じ型に対する 2 回以上のオーバーライド (つまり Assert に対する 2 回の呼び出し) が検出された場合は、2 回目のオーバーライドで例外がスローされます。
同じスタック フレームで異なる複数のオーバーライドが検出された場合には、ランタイムはこれらのオーバーライドを PermitOnly、Deny、Assert の順序で処理します。
オーバーライドを置き換えるには、まず適切な復帰メソッド (たとえば RevertAssert) を呼び出してから、新しいオーバーライドを適用します。
メモ |
---|
クラス コンストラクターのコードは、特定の位置または特定のコンテキストで実行されるとは限らないため、クラス コンストラクターでスタック ウォークのオーバーライドを行うことは避ける必要があります。クラス コンストラクターのコール スタックの状態は完全には定義されないため、コンストラクターでスタック ウォークのオーバーライドを実行すると、予期しない、望ましくない結果が生じる可能性があります。 |
アプリケーションの開発者は、通常は Assert、Deny、または PermitOnly を使用する必要はありません。コンポーネントやクラス ライブラリの開発者も、これらを使用する機会はほとんどありません。 ただし、セキュリティのオーバーライドを行った方が適切な場合もあります。詳細については、Assert、Deny、PermitOnly の各トピックを参照してください。
メモ |
---|
オーバーライド (Deny、Assert、または PermitOnly) を実行する場合は、同じスタック フレーム (つまり、メソッド) で同じ種類のオーバーライドを実行する前に、アクセス許可を元に戻す必要があります。それ以外の場合は、SecurityException がスローされます。たとえば、アクセス許可 P を拒否した場合は、同じメソッドで別のアクセス許可 Q を拒否する前に、前のアクセス許可を元に戻す必要があります。 |
オーバーライドを元に戻す静的メソッドを次の表に示します。
メソッド |
メソッドのアクション |
---|---|
現在のフレームにおける以前のすべてのオーバーライドが削除され、その効力がなくなります。 |
|
現在のフレームにおける以前のどの Assert も削除され、その効力がなくなります。 |
|
現在のフレームにおける以前のどの Deny も削除され、その効力がなくなります。 このメソッドは、.NET Framework 4 で互換性のために残されています。 |
|
現在のフレームにおける以前のどの PermitOnly も削除され、その効力がなくなります。 |