Momentálne ste offline a čaká sa, kým sa znova pripojíte na internet

Implementácia zosobnenia v aplikácii ASP.NET

Tento článok odkazuje na nasledujúce priestory názvov knižnice tried rozhrania Microsoft .NET:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
Súhrn
V tomto článku sa popisujú rôzne spôsoby implementácie zosobnenia v aplikácii ASP.NET.
Ďalšie informácie
Ak chcete zosobniť používateľa vo vlákne súčasti ASP.NET, v závislosti od svojich požiadaviek môžete použiť jeden z nasledujúcich postupov:
Poznámka: Ak chcete určiť, pod akým používateľom sa vlákno spúšťa, môžete použiť nasledujúci kód:
System.Security.Principal.WindowsIdentity.GetCurrent().Name				

Zosobnenie overeného konta alebo používateľa služby IIS

Ak chcete overujúceho používateľa služby Microsoft Internet Information Services (IIS) zosobniť pri každej požiadavke na každú stránku v aplikácii ASP.NET, musíte pridať značku <identity> do súboru Web.config danej aplikácie a nastaviť atribút impersonate na hodnotu true. Príklad:
<identity impersonate="true" />				
Späť na začiatok

Zosobnenie konkrétneho používateľa pre všetky požiadavky aplikácie ASP.NET

Ak chcete zosobniť konkrétneho používateľa pre všetky požiadavky na všetkých stránkach aplikácie ASP.NET, môžete zadať atribúty userName a password v značke <identity> súboru Web.config pre danú aplikáciu. Príklad:
<identity impersonate="true" userName="accountname" password="password" />				
Poznámka: Identita procesu, ktorý zosobňuje konkrétneho používateľa vo vlákne, musí mať oprávnenie Act as part of the operating system (Vystupovať ako súčasť operačného systému). V predvolenom nastavení sa proces Aspnet_wp.exe spúšťa pomocou konta s názvom ASPNET v počítači. Toto konto však nemá požadované oprávnenia na zosobnenie konkrétneho používateľa. Ak sa pokúsite zosobniť konkrétneho používateľa, zobrazí sa chybové hlásenie. Tieto informácie sa vzťahujú len na rozhranie .NET Framework 1.0. Toto oprávnenie sa nevyžaduje pre platformu .NET Framework 1.1.

Ak chcete tento problém obísť, použite jeden z nasledujúcich postupov:
  • Prideľte kontu ASPNET (kontu s najmenším rozsahom oprávnení) oprávnenie Act as part of the operating system (Vystupovať ako súčasť operačného systému).

    Poznámka: Hoci pomocou tohto postupu môžete obísť tento problém, spoločnosť Microsoft ho neodporúča.
  • V časti konfigurácie <processModel> súboru Machine.config zmeňte konto, pod ktorým sa spúšťa proces Aspnet_wp.exe, na konto System.
Späť na začiatok

Zosobnenie overujúceho používateľa v kóde

Ak chcete overujúceho používateľa (User.Identity) zosobniť len pri spúšťaní určitej časti kódu, môžete použiť nasledujúci kód. Tento postup vyžaduje, aby bola identita overujúceho používateľa 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()'Sem vložte kód, ktorý sa spúšťa v rámci kontextu zabezpečenia overujúceho používateľa.impersonationContext.Undo()				
Visual C# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();//Sem vložte kód, ktorý sa spúšťa v rámci kontextu zabezpečenia overujúceho používateľa.impersonationContext.Undo();				
Visual J# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)get_User().get_Identity()).Impersonate();//Sem vložte kód, ktorý sa spúšťa v rámci kontextu zabezpečenia overujúceho používateľa.impersonationContext.Undo();				
Späť na začiatok

Zosobnenie konkrétneho používateľa v kóde

Ak chcete zosobniť konkrétneho používateľa len pri spúšťaní určitej časti kódu, použite nasledujúci 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        'Sem vložte kód, ktorý sa spúšťa v rámci kontextu zabezpečenia konkrétneho používateľa.        undoImpersonation()    Else        'Zosobnenie zlyhalo. Preto sem vložte mechanizmus pre prípad zlyhania.    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"))	{		//Sem vložte kód, ktorý sa spúšťa v rámci kontextu zabezpečenia konkrétneho používateľa.		undoImpersonation();	}	else	{		//Zosobnenie zlyhalo. Preto sem vložte mechanizmus pre prípad zlyhania.	}}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"))	{		//Sem vložte kód, ktorý sa spúšťa v rámci kontextu zabezpečenia konkrétneho používateľa.		undoImpersonation();	}	else	{		//Zosobnenie zlyhalo. Preto sem vložte mechanizmus pre prípad zlyhania.	}}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: Ak sa proces Aspnet_wp.exe spúšťa v počítači so systémom Microsoft Windows 2000, identita procesu, ktorý zosobňuje konkrétneho používateľa vo vlákne, musí mať oprávnenie Act as part of the operating system (Vystupovať ako súčasť operačného systému). Oprávnenie Act as part of the operating system (Vystupovať ako súčasť operačného systému) sa nevyžaduje, ak sa proces Aspnet_wp.exe spúšťa v počítači so systémom Windows XP alebo Windows Server 2003. V predvolenom nastavení sa proces Aspnet_wp.exe spúšťa pomocou konta s názvom ASPNET v počítači. Toto konto však nemá požadované oprávnenia na zosobnenie konkrétneho používateľa. Ak sa pokúsite zosobniť konkrétneho používateľa, zobrazí sa chybové hlásenie. .

Ak chcete tento problém obísť, použite jeden z nasledujúcich postupov:
  • Prideľte kontu ASPNET oprávnenie Act as part of the operating system (Vystupovať ako súčasť operačného systému).

    Poznámka: Tento postup sa na obídenie tohto problému neodporúča.
  • V časti konfigurácie <processModel> súboru Machine.config zmeňte konto, pod ktorým sa spúšťa proces Aspnet_wp.exe, na konto System.
Späť na začiatok
Odkazy
Ďalšie informácie o zabezpečení technológie ASP.NET získate po kliknutí na nasledujúce číslo článku publikovaného v databáze Microsoft Knowledge Base:
306590 Prehľad zabezpečenia technológie ASP.NET
login failed null (null) impersonate
Vlastnosti

ID článku: 306158 – Posledná kontrola: 11/29/2013 21:40:00 – Revízia: 4.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 KB306158
Pripomienky