2009-05-04 4 views
0

사용자를 가장하는 중 문제가 발생했습니다.선언적 보안 요구 사항 - SecurityAction.Demand가 캐시됩니까?

[PrincipalPermission(SecurityAction.Demand, [email protected]"DJPITER-PC\Test", Role="LocalTestGroup")] 
static void LocalTestGroupOnly() 
{ 
    Console.WriteLine("Inside LocalTestGroupOnly() - {0}", 
     WindowsIdentity.GetCurrent().Name); 
} 

호출 코드는 다음과 같습니다 :

WindowsImpersonationContext context = 
     WindowsIdentity.Impersonate(token); 

    Console.WriteLine("Calling LocalTestGroupOnly() as {0}", 
     WindowsIdentity.GetCurrent().Name); 
    LocalTestGroupOnly(); 

    context.Undo(); 

    try 
    { 
     // Reverted user is displayed properly 
     Console.WriteLine("Calling LocalTestGroupOnly() as {0}", 
      WindowsIdentity.GetCurrent().Name); 

     // This method should fail but if succeeds 
     LocalTestGroupOnly(); 
    } 
    catch (SecurityException ex) 
    { 
     Console.WriteLine("Your account lacks permission to that function."); 
    } 

기본 사용자가 LocalTestGroup의 구성원이 아닌 I는 다음과 같이 선언하는 방법이있다. 토큰으로 표시된 사용자는 LocalTestGroup의 IS 멤버입니다.

문제 : 토큰에 의해 표시된 사용자 LocalTestGroup의 부재이기 때문에

LocalTestGroupOnly 내지 제() 호출이 성공한다. 기본 사용자가 'Test'가 아니며 LocalTestGroup에 속하지 않으므로 LocalTestGroupOnly()에 대한 두 번째 호출 (기본 사용자로)이 실패해야합니다. 문제는이 방법도 성공한다는 것입니다.

우리가 프로그램을 개별적으로 실행하는 경우 - 가장로 또는 가장없이 - 우리는 올바른 행동을 취합니다 : '테스트'로 가장 할 때 성공하고 기본 사용자로 호출 할 때 실패합니다.

여기의 문제는 무엇입니까?

답변

1

WindowsIdentity.GetCurrent() 대신 Thread.CurrentPrincipal.Identity을 확인할 수 있습니까? PrincipalPermission.Demand()은 첫 번째를 사용합니다.

Thread.CurrentPrincipal (또는 HttpContext.User)을 변경하려면 가장 및 취소 후에 명시 적으로 설정해야하는 것으로 보입니다. 유사한 질문은 here을 확인하십시오.

+0

사실 : context.Undo() 이후 Thread.CurrentPrincipal = new WindowsPrincipal (WindowsIdentity.GetCurrent())를 추가해야했습니다. 왜 Undo() 메서드가 그렇게하지 않았습니까? Thread.CurrentPrincipal 및 WindowsImpersonationContext를 완전히 이해하지 못하는 것 같습니다 ... – pkolodziej

+0

나는 몇 가지 예제를 찾아 보았고, 모두 가장 할 때 Thread.CurrentPrincipal을 명시 적으로 설정했습니다. 나는 내 대답에 더 많은 정보를 추가했다. –

+0

감사합니다. 좋은 하루 보내세요. – pkolodziej