Wie funktioniert .NET Sicherheit wirklich?

stimmen
1

Ich sah nur diese Frage:

.NET ist „Security“ Parameter für Berechtigungen Grundlegendes

Und ich habe eine Frage. Mit dem folgenden Code:

private void button1_Click(object sender, EventArgs e)
{
    Layer1();
    MessageBox.Show(OK);
}

private void Layer1()
{
    try
    {
        Layer2();
    }
    catch (SecurityException)
    {
        MessageBox.Show(Caught);
    }
    Layer2b();
}

private void Layer2()
{
    new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted).Deny();
    GC.Collect();
    Layer3();
}

private void Layer2b()
{
    Layer3();
}

[FileIOPermission(SecurityAction.LinkDemand, Write=@C:\temp)]
private void Layer3()
{
    using (FileStream stream = new FileStream(@C:\temp\test.txt, FileMode.Create))
    {
    }
}

warum hat der Code eine Sicherheitsausnahme mit dem Aufruf produzieren Layer2? Wie wird die Erlaubnis Objekt behandelt, ich könnte mir vorstellen , dass der Garbage Collector das Objekt zerstören würde, da ich keine aktive Verweis darauf haben , aber der Code sagt Gefangen und dann OK , so eindeutig die Erlaubnis Leugnung ist in der Tat für den Anruf durch Layer2.

Was gibt? Was vermisse ich? Ich werde zum Sein ein totaler Anfänger zugeben, wenn es um die Sicherheit / Berechtigungssystem kommt in .NET mir so vergeben, wenn diese Frage wirklich einfach.

Gibt es eine Sicherheits Zustimmung / Ablehnung wie diese Flagge den Stapel oder so etwas? Warum sonst ist es nicht in der Tat für Layer2b? Es ist das gleiche Gewinde, so deutlich, während es nicht von der Garbage Collection getötet wird, es an einem gewissen Punkt entfernt / zerstört / gereinigt wird immer.

Veröffentlicht am 09/12/2008 um 23:25
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Auf dem ersten Blick würde ich vermuten, dass die Erlaubnis Objekt noch im Rahmen, wie es in der Methode definiert ist, fällt es außerhalb des Gültigkeitsbereiches nach dem Abschluss der Layer2 Methode, also die letzte Zeile Ihrer Anwendung ermöglicht funktionieren.

Wie durch die akzeptierte Antwort erwähnt, dies ist becuase es im Gültigkeitsbereich des aktuellen Stack ist, auf Standard-Objekt Umfang bezogen, Sie verwalten nicht nur die Referenz. Das ist der beste Weg, um es daran zu erinnern,

Beantwortet am 09/12/2008 um 23:36
quelle vom benutzer

stimmen
3

Der Aufruf .Deny () auf einem Codeaccess wird die .NET-Sicherheitslaufzeit veranlassen, die leugnen Flagge auf dem Sicherheitsobjekt für den aktuellen Stapelrahmen für diese Berechtigung zu setzen. Also selbst wenn Sie GC.Collect () aufrufen, nach dem Aufruf .Deny (), ist es nicht wirklich wichtig, wird die Erlaubnis wirksam bleiben. Das Berechtigungsobjekt ist nur eine Darstellung des Zustandes des Teils der .NET Sicherheitslaufzeit zu einem Zeitpunkt (a Stapelrahmen).

Verwenden Sie einfach .NET Reflector mehr zu erfahren.

Beantwortet am 09/12/2008 um 23:39
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more