Implementace zosobnění v aplikaci ASP.NET

DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.

Projděte si také anglickou verzi článku: 306158
Tento článek se týká následujících Microsoft .NET Obory názvů knihovny tříd Framework:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
Souhrn
Tento článek popisuje různé způsoby, jak implementovat zosobnění v aplikaci ASP.NET.
Další informace
Pokud chcete zosobnit uživatele v podprocesu v technologii ASP.NET můžete použít jednu z následujících metod, podle své požadavky:
Poznámka: Můžete použít následující kód k určení, který uživatel vlákna provádění:
System.Security.Principal.WindowsIdentity.GetCurrent().Name				

IIS ověřen zosobnit účet nebo uživatele

K zosobnění Internetová informační služba (IIS) ověřování uživatele při každém požadavku pro každou stránku v aplikaci technologie ASP.NET je nutné zahrnout <identity></identity> značky v souboru Web.config aplikace a nastavte atribut impersonate na hodnotu true. Například:
<identity impersonate="true" />				
back to the top

Zosobnění určitého uživatele pro všechny požadavky aplikací technologie ASP.NET

K zosobnění určitého uživatele pro všechny požadavky na všech stránkách aplikace technologie ASP.NET můžete určit atributy userName a password v <identity></identity> značky v souboru Web.config aplikace. Například:
<identity impersonate="true" userName="accountname" password="password" />				
Poznámka: Identita procesu, který zosobňuje určitého uživatele v podproces musí mít oprávnění "Jednat jako část operačního systému". Podle Výchozí proces Aspnet_wp.exe je spuštěn v účtu počítače s názvem ASPNET. Nicméně, tento účet nemá dostatečná oprávnění k zosobnění konkrétního uživatele. Zobrazí chybová zpráva při pokusu o zosobnění konkrétního uživatele. Tyto informace se týkají pouze rozhraní.NET Framework 1.0. To oprávnění není požadováno rozhraní.NET Framework 1.1.

Chcete-li vyřešit Tento problém, použijte jednu z následujících metod:
  • Udělit oprávnění "Jednat jako část operačního systému" pro účet ASPNET (nejméně privilegovaném účtu).

    Poznámka: I když použijete tuto metodu řešení problému, Společnost Microsoft nedoporučuje tuto metodu.
  • Změnit účet, který spouští proces Aspnet_wp.exe v rámci systému účet v konfiguračním oddílu <processModel> souboru Machine.config.</processModel>
back to the top

Zosobnit uživatele ověřovací kód

K zosobnění ověřování uživatele (User.Identity), pouze pokud spustíte určitou část kódu, můžete použít kód dodržovat. Tato metoda vyžaduje, aby ověřující identitu uživatele typu 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();				
back to the top

Zosobnění určitého uživatele v kódu

K zosobnění určitého uživatele pouze v případě, že spustíte určité část kódu, použijte následující kód:

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>				
Poznámka: Identita procesu, který zosobňuje určitého uživatele v podproces musí mít oprávnění "Jednat jako část operačního systému" proces Aspnet_wp.exe je spuštěn v počítači se systémem Microsoft Windows 2000. Na "Jednat jako část operačního systému" oprávnění není požadováno, pokud Proces aspnet_wp.exe je spuštěn v počítači se systémem Windows XP nebo v systému Windows Server počítač se systémem 2003. Ve výchozím nastavení Aspnet_wp.exe proces spuštěn v účtu počítače s názvem ASPNET. Nicméně tento účet nemá Nemáte dostatečná oprávnění k zosobnění určitého uživatele. Zobrazí se chybová zpráva při pokusu o zosobnění určitého uživatele. .

Chcete-li tento problém vyřešit, použijte jednu z následujících metod:
  • Udělit oprávnění "Jednat jako část operačního systému" pro účet ASPNET.

    Poznámka: Nedoporučujeme tento způsob řešení došlo k potížím.
  • Změnit účet, který spouští proces Aspnet_wp.exe v rámci systému účet v konfiguračním oddílu <processModel> souboru Machine.config.</processModel>
zpět horní
Odkazy
Další informace o Zabezpečení technologie ASP.NET klepněte na následující číslo článku v Znalostní báze Microsoft Knowledge Base:
306590Přehled zabezpečení technologie ASP.NET
přihlášení se nezdařilo null (null) zosobnění

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 306158 - Poslední kontrola: 06/07/2013 04:43:00 - Revize: 7.0

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 kbmt KB306158 KbMtcs
Váš názor