현재 오프라인 상태입니다. 인터넷에 다시 연결하기를 기다리고 있습니다.

ASP.NET 응용 프로그램에서 가장(Impersonation)을 구현하는 방법

이 문서는 이전에 다음 ID로 출판되었음: KR306158
이 문서에서 참조하는 Microsoft .NET Framework 클래스 라이브러리 네임스페이스는 다음과 같습니다.
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
요약
이 문서에서는 ASP.NET 응용 프로그램에서 가장을 구현하는 여러 가지 방법을 설명합니다.
추가 정보
ASP.NET의 스레드에서 사용자를 가장하려면 다음 중 사용자에게 필요한 방법을 사용하십시오.
참고 다음 코드를 사용하면 스레드가 어떤 사용자로 실행 중인지 확인할 수 있습니다.
 System.Security.Principal.WindowsIdentity.GetCurrent().Name 				

IIS 인증 계정이나 사용자 가장

ASP.NET 응용 프로그램의 모든 페이지에 대한 요청에서 Microsoft Internet Information Services(IIS) 인증 사용자를 가장하려면 해당 응용 프로그램의 Web.config 파일에 <identity> 태그를 포함시키고 impersonate 특성을 true로 설정해야 합니다. 예를 들면 다음과 같습니다.
<identity impersonate="true" />				
맨 위로

ASP.NET 응용 프로그램의 모든 요청에 대해 특정 사용자 가장

TASP.NET 응용 프로그램의 모든 페이지에 대한 요청에서 특정 사용자를 가장하려면 해당 응용 프로그램의 Web.config 파일에서 <identity> 태그의 userNamepassword 특성을 지정합니다. 예를 들면 다음과 같습니다.
 <identity impersonate="true" userName="accountname" password="password" /> 				
참고 스레드에서 특정 사용자를 가장하는 프로세스의 ID는 "운영 체제의 일부로 활동" 권한을 갖고 있어야 합니다. 기본적으로 Aspnet_wp.exe 프로세스는 ASPNET이라는 컴퓨터 계정으로 실행됩니다. 그러나 이 계정에는 특정 사용자를 가장하는 데 필요한 권한이 없습니다. 특정 사용자를 가장하려고 하면 오류 메시지가 나타납니다. 이 문제는 .NET Framework 1.0에만 적용됩니다. .NET Framework 1.1에서는 이 권한이 필요하지 않습니다.

이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.
  • "운영 체제의 일부로 활동" 권한을 ASPNET 계정(최소의 권한이 부여된 계정)에 부여합니다.

    참고 이 방법을 사용하여 문제를 해결할 수 있지만 Microsoft가 권장하는 방법은 아닙니다.
  • Aspnet_wp.exe 프로세스를 실행하는 계정을 Machine.config 파일의 <processModel> 구성 섹션에 있는 시스템 계정으로 변경합니다.
맨 위로

코드에서 인증 사용자 가장

특정 코드 섹션을 실행할 때만 인증 사용자(User.Identity)를 가장하려면 다음과 같은 코드를 사용합니다. 이 방법을 사용하려면 인증 사용자 ID가 WindowsIdentity 형식이어야 합니다.

Visual Basic .NET
Dim impersonationContext As System.Security.Principal.WindowsImpersonationContextDim currentWindowsIdentity As System.Security.Principal.WindowsIdentitycurrentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)impersonationContext = currentWindowsIdentity.Impersonate()'Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo()				
Visual C# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();//Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo();				
Visual J# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)get_User().get_Identity()).Impersonate();//Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo();				
맨 위로

코드에서 특정 사용자 가장

특정 코드 섹션을 실행할 때만 특정 사용자를 가장하려면 다음과 같은 코드를 사용합니다.

Visual Basic .NET
<%@ Page Language="VB" %><%@ Import Namespace = "System.Web" %><%@ Import Namespace = "System.Web.Security" %><%@ Import Namespace = "System.Security.Principal" %><%@ Import Namespace = "System.Runtime.InteropServices" %><script runat=server>Dim LOGON32_LOGON_INTERACTIVE As Integer = 2Dim LOGON32_PROVIDER_DEFAULT As Integer = 0Dim impersonationContext As WindowsImpersonationContextDeclare Function LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As String, _                        ByVal lpszDomain As String, _                        ByVal lpszPassword As String, _                        ByVal dwLogonType As Integer, _                        ByVal dwLogonProvider As Integer, _                        ByRef phToken As IntPtr) As IntegerDeclare Auto Function DuplicateToken Lib "advapi32.dll" ( _                        ByVal ExistingTokenHandle As IntPtr, _                        ByVal ImpersonationLevel As Integer, _                        ByRef DuplicateTokenHandle As IntPtr) As IntegerDeclare Auto Function RevertToSelf Lib "advapi32.dll" () As LongDeclare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As LongPublic Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)    If impersonateValidUser("username", "domain", "password") Then        'Insert your code that runs under the security context of a specific user here.        undoImpersonation()    Else        'Your impersonation failed. Therefore, include a fail-safe mechanism here.    End IfEnd SubPrivate Function impersonateValidUser(ByVal userName As String, _ByVal domain As String, ByVal password As String) As Boolean    Dim tempWindowsIdentity As WindowsIdentity    Dim token As IntPtr = IntPtr.Zero    Dim tokenDuplicate As IntPtr = IntPtr.Zero    impersonateValidUser = False    If RevertToSelf() Then        If LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,                      LOGON32_PROVIDER_DEFAULT, token) <> 0 Then            If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then                tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)                impersonationContext = tempWindowsIdentity.Impersonate()                If Not impersonationContext Is Nothing Then                    impersonateValidUser = True                End If            End If        End If    End If    If Not tokenDuplicate.Equals(IntPtr.Zero) Then        CloseHandle(tokenDuplicate)    End If    If Not token.Equals(IntPtr.Zero) Then        CloseHandle(token)    End IfEnd FunctionPrivate Sub undoImpersonation()    impersonationContext.Undo()End Sub</script>
Visual C# .NET
<%@ Page Language="C#"%><%@ Import Namespace = "System.Web" %><%@ Import Namespace = "System.Web.Security" %><%@ Import Namespace = "System.Security.Principal" %><%@ Import Namespace = "System.Runtime.InteropServices" %><script runat=server>public const int LOGON32_LOGON_INTERACTIVE = 2;public const int LOGON32_PROVIDER_DEFAULT = 0;WindowsImpersonationContext impersonationContext; [DllImport("advapi32.dll")]public static extern int LogonUserA(String lpszUserName, 	String lpszDomain,	String lpszPassword,	int dwLogonType, 	int dwLogonProvider,	ref IntPtr phToken);[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern int DuplicateToken(IntPtr hToken, 	int impersonationLevel,  	ref IntPtr hNewToken);                          [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern bool RevertToSelf();[DllImport("kernel32.dll", CharSet=CharSet.Auto)]public static extern  bool CloseHandle(IntPtr handle);public void Page_Load(Object s, EventArgs e){	if(impersonateValidUser("username", "domain", "password"))	{		//Insert your code that runs under the security context of a specific user here.		undoImpersonation();	}	else	{		//Your impersonation failed. Therefore, include a fail-safe mechanism here.	}}private bool impersonateValidUser(String userName, String domain, String password){	WindowsIdentity tempWindowsIdentity;	IntPtr token = IntPtr.Zero;	IntPtr tokenDuplicate = IntPtr.Zero;	if(RevertToSelf())	{		if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 			LOGON32_PROVIDER_DEFAULT, ref token) != 0)		{			if(DuplicateToken(token, 2, ref tokenDuplicate) != 0) 			{				tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);				impersonationContext = tempWindowsIdentity.Impersonate();				if (impersonationContext != null)				{					CloseHandle(token);					CloseHandle(tokenDuplicate);					return true;				}			}		} 	}	if(token!= IntPtr.Zero)		CloseHandle(token);	if(tokenDuplicate!=IntPtr.Zero)		CloseHandle(tokenDuplicate);	return false;}private void undoImpersonation(){	impersonationContext.Undo();}</script>
Visual J# .NET
<%@ Page language="VJ#" %><%@ Import Namespace="System.Web" %><%@ Import Namespace="System.Web.Security" %><%@ Import Namespace="System.Security.Principal" %><%@ Import Namespace="System.Runtime.InteropServices" %><script runat=server>public static int LOGON32_LOGON_INTERACTIVE = 2;public static int LOGON32_PROVIDER_DEFAULT = 0;WindowsImpersonationContext impersonationContext; /** @attribute DllImport("advapi32.dll") */ public static native int LogonUserA(String lpszUserName, 	String lpszDomain, 	String lpszPassword,	int dwLogonType, 	int dwLogonProvider, 	System.IntPtr[] phToken);/** @attribute DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true) */ public static native int DuplicateToken(System.IntPtr hToken,	int impersonationLevel,	System.IntPtr[] hNewToken);/** @attribute DllImport("kernel32.dll",CharSet=CharSet.Auto) */ public static native  boolean CloseHandle(System.IntPtr[] handle);/** @attribute DllImport("advapi32.dll", 	 CharSet=CharSet.Auto,SetLastError=true) */	 public static native boolean RevertToSelf();public void Page_Load(Object s, System.EventArgs e){	if(impersonateValidUser("username", "domain", " password"))	{		//Insert your code that runs under the security context of a specific user here.		undoImpersonation();	}	else	{		//Your impersonation failed. Therefore, include a fail-safe mechanism here.	}}private boolean impersonateValidUser(String userName, String domain, String password){	WindowsIdentity tempWindowsIdentity;	System.IntPtr[] token = new System.IntPtr[1];	System.IntPtr[] tokenDuplicate = new System.IntPtr[1];	if(RevertToSelf())	{		if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 			LOGON32_PROVIDER_DEFAULT, token) != 0)		{			if(DuplicateToken(token[0], 2, tokenDuplicate) != 0) 			{				tempWindowsIdentity = new WindowsIdentity(tokenDuplicate[0]);				impersonationContext = tempWindowsIdentity.Impersonate();				if (impersonationContext != null)				{					CloseHandle(tokenDuplicate);					CloseHandle(token);					return true;				}							}					} 	}	if(!token[0].Equals(System.IntPtr.Zero))		CloseHandle(token);	if(!tokenDuplicate[0].Equals(System.IntPtr.Zero))		CloseHandle(tokenDuplicate);	return false;}private void undoImpersonation(){	impersonationContext.Undo();}</script>				
참고 스레드에서 특정 사용자를 가장하는 프로세스 ID는 "운영 체제의 일부로 활동" 권한을 갖고 있어야 합니다. 기본적으로 Aspnet_wp.exe 프로세스는 ASPNET이라는 컴퓨터 계정으로 실행됩니다. 그러나 이 계정에는 특정 사용자를 가장하는 데 필요한 권한이 없습니다. 특정 사용자를 가장하려고 하면 오류 메시지가 나타납니다. 이 문제는 .NET Framework 1.0에만 적용됩니다. .NET Framework 1.1에서는 이 권한이 필요하지 않습니다.

이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.
  • "운영 체제의 일부로 작동할 수 있는" 권한을 ASPNET 계정에 부여합니다.

    참고 이 문제를 해결하기 위한 방법으로 권장하는 방법은 아닙니다.
  • Aspnet_wp.exe 프로세스를 실행하는 계정을 Machine.config 파일의 <processModel> 구성 섹션에 있는 시스템 계정으로 변경합니다.
맨 위로
참조
ASP.NET 보안에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
306590 INFO: ASP.NET 보안 개요




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.
login failed null (null) impersonate
속성

문서 ID: 306158 - 마지막 검토: 07/11/2005 06:10:28 - 수정: 4.6

Microsoft ASP.NET 1.0, Microsoft ASP.NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition

  • kbinfo kbsecurity KB306158
피드백