В этом коде я хотел бы, чтобы метод ReadFileSystem был запрещен для подтверждения разрешения на файловую систему.Как отрицать Assert с CAS?
Я ожидал, что это будет выбрано fileIo.Assert(), но это не так. Зачем?
using System.Security.Permissions;
static void Main(string[] args)
{
var fileIo = new FileIOPermission(PermissionState.Unrestricted);
var secuPerm = new SecurityPermission(SecurityPermissionFlag.Assertion);
PermissionSet set = new PermissionSet(PermissionState.Unrestricted);
set.AddPermission(fileIo);
set.AddPermission(secuPerm);
set.Deny();
ReadFileSystem();
Console.Read();
}
private static void ReadFileSystem()
{
var fileIo = newFileIOPermission(PermissionState.Unrestricted);
fileIo.Assert();
DirectoryInfo dir = new DirectoryInfo("C:/");
dir.GetDirectories();
}
Update
Великая ссылка здесь на CAS: http://blogs.msdn.com/shawnfa/archive/2004/08/25/220458.aspx
binarycoder точно прав. .NET редко утверждает внутренне ... Обычно это требует. Спрос - это то, что делает стек, который найдет отрицание в стеке и потерпит неудачу. Для всех файлов IO .NET выполняет запрос. Но как только он найдет Assert в стеке, стековая прогулка прекращается. –
И как предложил binarycoder, единственный способ заставить Assert выполнять свою работу - это лишить всю сборку разрешений, которые вы пытаетесь утвердить, эффективно делая свою сборку с частичным доверием. Частичное доверие - это хорошо, но если вы не хотите иметь возможность называть Assert, просто не называйте его? –
@ Андрей, я хотел быть уверенным, что любой вызов после моего Assert не может получить доступ к жесткому диску. Поскольку мой вариант использования заключался в том, чтобы вызвать другую сборку через отражение (не доверенный), без необходимости настраивать данные при загрузке. Наконец, это то, что я сделал. Но это поведение CAS заинтриговало меня. –