Implementácia zosobnenia v aplikácii ASP.NET

Preklady článku Preklady článku
ID článku: 306158 - Zobraziť produkty, ktorých sa tento článok týka.
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
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

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" />
				

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.

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.WindowsImpersonationContext
Dim currentWindowsIdentity As System.Security.Principal.WindowsIdentity

currentWindowsIdentity = 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();
				

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 = 2
Dim LOGON32_PROVIDER_DEFAULT As Integer = 0

Dim impersonationContext As WindowsImpersonationContext

Declare 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 Integer

Declare Auto Function DuplicateToken Lib "advapi32.dll" ( _
                        ByVal ExistingTokenHandle As IntPtr, _
                        ByVal ImpersonationLevel As Integer, _
                        ByRef DuplicateTokenHandle As IntPtr) As Integer

Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long


Public 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 If
End Sub

Private 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 If
End Function

Private 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.

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

Vlastnosti

ID článku: 306158 - Posledná kontrola: 29. novembra 2013 - Revízia: 4.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • 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
Kľúčové slová: 
kbinfo kbsecurity KB306158

Odošlite odozvu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com