다음을 통해 공유


가장 및 되돌리기

Windows 계정을 가장하기 위해 Windows NT 계정 토큰을 가져와야 하는 경우가 있습니다. 예를 들어, ASP.NET 기반 응용 프로그램에서 서로 다른 시기에 여러 사용자를 대신해야 하는 경우도 있습니다. 이런 경우 해당 응용 프로그램에서 IIS(인터넷 정보 서비스)로부터 관리자를 나타내는 토큰을 받아들여, 해당 사용자를 가장하여 작업을 수행한 다음, 이전 ID로 되돌릴 수 있습니다. 그런 다음, 보다 권한이 적은 사용자를 나타내는 토큰을 IIS로부터 받아들여 일부 작업을 수행한 다음 다시 이전 ID로 되돌릴 수 있습니다.

응용 프로그램에서 IIS로 현재 스레드에 연결되지 않은 Windows 계정을 가장해야 하는 경우에는 해당 계정의 토큰을 검색하고 이 토큰을 사용하여 해당 계정을 활성화해야 합니다. 다음 작업을 수행하여 이렇게 할 수 있습니다.

  1. 관리되지 않는 LogonUser 메서드를 호출하여 특정 사용자에 대한 계정 토큰을 검색합니다. 이 메서드는 .NET Framework 기본 클래스 라이브러리에 있지 않고 관리되지 않는 advapi32.dll에 있습니다. 비관리 코드의 메서드에 액세스하는 것은 고급 작업이므로 여기서는 다루지 않기로 합니다. 자세한 내용은 비관리 코드와의 상호 운용을 참조하십시오. LogonUser 메서드 및 advapi32.dll에 대한 자세한 내용은 Platform SDK 설명서를 참조하십시오.

  2. WindowsIdentity 클래스의 새 인스턴스를 만들고 여기에 검색한 토큰을 전달합니다. 다음 코드에서는 hToken이 Windows 토큰을 나타내는 호출을 보여 줍니다.

    WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
    
    Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
    
  3. 다음 코드에서와 같이 WindowsImpersonationContext 클래스의 새 인스턴스를 만들고 이를 초기화된 클래스의 WindowsIdentity.Impersonate 메서드로 초기화하여 가장을 시작합니다.

    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
    
    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
    
  4. 더 이상 가장할 필요가 없게 되면 다음 코드에서처럼 WindowsImpersonationContext.Undo 메서드를 호출하여 가장을 되돌립니다.

    MyImpersonation.Undo();
    
    MyImpersonation.Undo()
    

트러스트된 코드에서 WindowsPrincipal 개체를 이미 스레드에 연결한 경우에는 계정 토큰을 사용하지 않는 인스턴스 메서드 Impersonate를 호출할 수 있습니다. 이 방법은 스레드의 WindowsPrincipal 개체가 현재 프로세스를 실행 중인 사용자가 아닌 다른 사용자를 나타낼 때에만 유용합니다. 예를 들어, Windows 인증을 설정하고 가장은 설정 해제한 상태에서 ASP.NET을 사용하면 이러한 상황이 발생합니다. 이 경우, 프로세스는 IIS(인터넷 정보 서비스)에서 구성된 계정으로 실행되고 현재 보안 주체는 해당 페이지에 액세스하는 Windows 사용자를 나타냅니다.

ImpersonateUndo는 모두 현재 호출 컨텍스트와 관련된 Principal 개체를 변경하지 않습니다. 반대로, 가장과 되돌리기는 현재 운영 체제 프로세스와 관련된 토큰을 변경합니다.

참고 항목

참조

WindowsIdentity

WindowsImpersonationContext

개념

Principal 개체 및 Identity 개체

ASP.NET 가장

ASP.NET 가장과 함께 IIS 인증 사용

기타 리소스

비관리 코드와의 상호 운용