다음을 통해 공유


사칭 및 복구

비고

이 문서는 Windows에 적용됩니다.

ASP.NET Core에 대한 자세한 내용은 ASP.NET Core Security를 참조하세요.

Windows 계정을 가장하기 위해 Windows 계정 토큰을 가져와야 하는 경우도 있습니다. 예를 들어 ASP.NET 기반 애플리케이션은 각기 다른 시간에 여러 사용자를 대신하여 동작해야 할 수 있습니다. 애플리케이션은 IIS(인터넷 정보 서비스)의 관리자를 나타내는 토큰을 수락하고, 해당 사용자를 가장하고, 작업을 수행하고, 이전 ID로 되돌릴 수 있습니다. 다음으로, 권한이 적은 사용자를 나타내는 IIS의 토큰을 수락하고, 일부 작업을 수행하고, 다시 되돌릴 수 있습니다.

애플리케이션이 IIS에서 현재 스레드에 연결되지 않은 Windows 계정을 가장해야 하는 경우 해당 계정의 토큰을 검색하여 계정을 활성화하는 데 사용해야 합니다. 다음 작업을 수행하여 이 작업을 수행할 수 있습니다.

  1. 관리되지 않는 LogonUser 메서드를 호출하여 특정 사용자의 계정 토큰을 검색합니다. 이 메서드는 .NET 기본 클래스 라이브러리에 없지만 관리되지 않는 advapi32.dll있습니다. 관리되지 않는 코드에서 메서드에 액세스하는 것은 고급 작업이며 이 설명의 범위를 벗어납니다. 자세한 내용은 비관리 코드 상호 운용을 참조하세요. LogonUser 메서드 및 advapi32.dll대한 자세한 내용은 플랫폼 SDK 설명서를 참조하세요.

  2. 토큰을 전달하여 WindowsIdentity 클래스의 새 인스턴스를 만듭니다. 다음 코드는 Windows 토큰을 나타내는 이 호출 hToken 을 보여 줍니다.

    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 사용자를 나타냅니다.

가장 또는 실행 취소는 현재 호출 컨텍스트와 연결된 보안 주체 개체(IPrincipal)를 변경하지 않습니다. 오히려 대리 실행 및 복구는 현재 운영 체제 프로세스와 연결된 토큰을 변경합니다.

참고하십시오