사용자를 가장하는 중 문제가 발생했습니다.선언적 보안 요구 사항 - 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()에 대한 두 번째 호출 (기본 사용자로)이 실패해야합니다. 문제는이 방법도 성공한다는 것입니다.
우리가 프로그램을 개별적으로 실행하는 경우 - 가장로 또는 가장없이 - 우리는 올바른 행동을 취합니다 : '테스트'로 가장 할 때 성공하고 기본 사용자로 호출 할 때 실패합니다.
여기의 문제는 무엇입니까?
사실 : context.Undo() 이후 Thread.CurrentPrincipal = new WindowsPrincipal (WindowsIdentity.GetCurrent())를 추가해야했습니다. 왜 Undo() 메서드가 그렇게하지 않았습니까? Thread.CurrentPrincipal 및 WindowsImpersonationContext를 완전히 이해하지 못하는 것 같습니다 ... – pkolodziej
나는 몇 가지 예제를 찾아 보았고, 모두 가장 할 때 Thread.CurrentPrincipal을 명시 적으로 설정했습니다. 나는 내 대답에 더 많은 정보를 추가했다. –
감사합니다. 좋은 하루 보내세요. – pkolodziej