コード アクセス セキュリティを研究しています。理解するのに多少の努力が必要なので、最終的には Reflector を使用して、.NET 4.0 がセキュリティ属性をどのように使用するかを調査し始めようと考えました。
観察
メソッドは属性System.IO.File.Delete
で装飾されています。[SecuritySafeCritical]
このメソッドは、属性で装飾されSystem.IO.File.Delete
た内部メソッドInternalDelete[SecurityCritical]
に委譲します。
MVC アプリ クラスの 1 つに、次のように実行されているDeleteFileというメソッドがあります (これは、 DeleteFileの MethodInfo.IsSecurityCritical プロパティSecurityTransparent
をチェックして確認しました)。
権限
私の現在の理解から、それは次のことを意味します:
- System.IO.File.Delete はInternalDeleteを呼び出すことができます。これは、
[SecuritySafeCritical]
メソッドが呼び出すことができる[SecurityCritical]
ため、SecurityException がスローされないためです。 - DeleteFileを呼び出すことができるため、System.IO.File.Deleteを呼び出すこと
[SecurityTransparent]
ができます。[SecuritySafeCritical]
したがって、基本的に、すぐに使用できるセキュリティ設定を調整しなくても、このコードは test.txt というダミー ファイルを正常に削除します。
namespace MyTestMvcApp
{
public class FileHelpers()
{
// Has SecurityTransparent
public void DeleteFile()
{
// Will succesfully delete the file
File.Delete("test.txt");
}
}
}
錯乱
のInternalDeleteメソッド内で、メソッドをSystem.IO.File.Delete
使用しCodeAccessPermission.Demand
て、スタックのすべての呼び出し元が必要なアクセス許可を持っていることを確認します。私がよく理解していないのは、次の MSDN ドキュメントのCodeAccessPermission.Demand
次の行です。
このメソッドを呼び出すコードの権限は検査されません。チェックは、そのコードの直接の呼び出し元から開始され、スタックを上に進みます。
私の質問は、私のアプリケーションのDeleteFileSecurityTransparent
メソッドが である場合、どうしてメソッドを呼び出すことができるのSecurityCritical
でしょうか?
これはおそらくいくつかの概念が欠けている壊れた例ですが、私が言ったように、私はまだそれについて頭を悩ませています.
ありがとう