Как безопасности .NET действительно работает?

голоса
1

Я только что видел этот вопрос:

Понимание параметра .NET в «SecurityAction» для разрешения

И у меня есть вопрос. С помощью следующего кода:

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))
    {
    }
}

почему код производит исключение безопасности с вызовом Layer2? Как лечится объект разрешения, я бы себе представить , что сборщик мусора уничтожит объект, так как у меня нет активной ссылки на него, но код говорит , пойманной , а затем ОК , так ясно разрешение отказ в силу для вызова через Layer2.

Что дает? Что мне не хватает? Я признаю, что новичок общей, когда речь идет о системе безопасности / разрешений в .NET так что простите меня, если этот вопрос действительно основным.

Делает разрешения безопасности / отказ, как этот флаг в стек или что-то? В противном случае, почему он не действует для Layer2b? Это та же нить, так ясно, в то время как он не убит сбора мусора, он становится удален / уничтожен / вычистили в какой-то момент.

Задан 09/12/2008 в 23:25
источник пользователем
На других языках...                            


2 ответов

голоса
3

Вызов .Deny () на CodeAccessPermission заставит выполнения .NET Security установить флаг отказать в безопасности объекта для текущего кадра стека для этого разрешения. Так что даже если вы звоните GC.Collect () после вызова .Deny (), это действительно не имеет значения, разрешение будет оставаться в силе. Объект разрешения только представление состояния части выполнения безопасности .NET в определенный момент времени (кадр стека).

Просто используйте .NET Reflector, чтобы узнать больше.

Ответил 09/12/2008 в 23:39
источник пользователем

голоса
0

На первый взгляд, я бы предположил, что объект разрешение еще находится в области видимости, как это определено внутри метода, он выходит из области видимости после завершения метода Layer2, позволяя тем самым последнюю строку вашего приложения, чтобы функционировать.

Как отмечает принятый ответ, это потому что он в области для текущего стека, связанные со стандартной рамки объекта, вы просто не удается ссылку. Это лучший способ запомнить его

Ответил 09/12/2008 в 23:36
источник пользователем

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