문제

방금이 질문을 보았습니다.

권한에 대한 .NET의 "보안 작용"매개 변수를 이해합니다

그리고 질문이 있습니다. 다음 코드로 :

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에 적용되지 않습니까? 그것은 같은 스레드이기 때문에 쓰레기 수집에 의해 죽이지 않지만 어느 시점에서 제거/파괴/청소를 받고 있습니다.

도움이 되었습니까?

해결책

CodeAccessPermission에서 .deny ()를 호출하면 .NET Security Runtime이 해당 권한의 현재 스택 프레임에 대한 보안 객체의 Deny 플래그를 설정하게됩니다. 따라서 .deny ()를 호출 한 후 gc.collect ()를 호출하더라도 실제로는 중요하지 않으므로 허가는 유효합니다. 권한 객체는 시점 (스택 프레임)에서 .NET 보안 런타임 부분의 상태를 나타내는 것입니다.

.NET 리플렉터를 사용하여 자세한 내용을 알아보십시오.

다른 팁

첫 번째 살펴보면 허가 객체가 여전히 범위에 있다고 생각합니다. 메소드 내부에서 정의되어 있으므로 Layer2 메소드가 완료된 후에도 범위가 떨어 지므로 응용 프로그램의 마지막 줄이 작동 할 수 있습니다.

허용 된 답변에서 언급 한 바와 같이, 이것은 표준 객체 범위와 관련하여 현재 스택의 범위에 있기 때문에 참조를 관리하지 않습니다. 그것이 그것을 기억하는 가장 좋은 방법입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top