In diesem Code möchte ich, dass die ReadFileSystem-Methode verboten ist, eine Berechtigung für das Dateisystem zu bestätigen.Wie kann man die Verwendung von CAS verweigern?
Ich erwartete, dass dies auf fileIo.Assert() werfen wird, aber es tut es nicht. Warum?
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();
}
aktualisiert
Großer Link hier auf CAS: http://blogs.msdn.com/shawnfa/archive/2004/08/25/220458.aspx
Binärcodierer ist genau richtig. .NET wird nur selten intern bestätigt ... Es erfordert normalerweise. Nachfrage ist, was der Stack laufen wird, der die Verweigerung auf dem Stack finden und scheitern würde. Für alle Datei-IO macht .NET eine Nachfrage. Sobald jedoch eine Assert auf dem Stack gefunden wird, wird der Stack Walk kurz angehalten. –
Und wie der Binärcodierer vorgeschlagen wurde, besteht die einzige Möglichkeit, Assert von seiner Arbeit abzuhalten, darin, der gesamten Assembly die Berechtigungen zu verweigern, die Sie geltend machen möchten. Dadurch wird Ihre Assembly effektiv mit partieller Vertrauenswürdigkeit ausgeführt. Partielles Vertrauen ist gut, aber wenn Sie Assert nicht anrufen wollen, rufen Sie es einfach nicht an. –
@Andrew, ich wollte sicher sein, dass jeder Anruf nach meiner Assert nicht auf die Festplatte zugreifen kann. Weil mein Anwendungsfall war, eine andere Assembly über Reflektion aufzurufen (nicht vertrauenswürdig), ohne den Beweis konfigurieren zu müssen, wenn ich ihn lade. Endlich ist es das, was ich getan habe. Aber dieses Verhalten von CAS hat mich fasziniert. –