כיצד ליישם התחזות ביישום ASP.NET

תרגומי מאמרים תרגומי מאמרים
Article ID: 306158 - View products that this article applies to.
מאמר זה מתייחס Microsoft .NET הבאה ספריית המחלקות framework טווחי שמות:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
הרחב הכל | כווץ הכל

On This Page

תקציר

מאמר זה מתאר דרכים שונות כדי ליישם התחזות ביישום ASP.NET.

מידע נוסף

אם ברצונך להתחזות למשתמש בהליך משנה ב- ASP.NET, באפשרותך להשתמש באחת מהשיטות הבאות, בהתאם requirments שלך: הערה באפשרותך להשתמש בקוד הבא כדי לקבוע אילו משתמשים המשנה (thread) מבצע כ:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
				

להתחזות IIS אימות המשתמש או חשבון

להתחזות את Microsoft Internet Information Services (IIS) אימות משתמש על כל בקשה עבור כל עמוד ביישום ASP.NET, עליך לכלול <identity></identity> תג בקובץ web. config של יישום זה והגדר את התכונה להתחזות כ- true. לדוגמה:
<identity impersonate="true" />
				

התחזות של משתמש ספציפי עבור כל הבקשות של יישום ASP.NET

כדי להתחזות למשתמש ספציפי עבור כל בקשות בכל העמודים יישום ASP.NET, באפשרותך לציין את שם המשתמש והסיסמה התכונות ב- <identity></identity> תג של הקובץ web. config עבור יישום זה. לדוגמה:
<identity impersonate="true" userName="accountname" password="password" />
				
הערה הזהות של התהליך שבו מתחזה משתמש מסוים על הליך משנה דרושה הרשאת "תפקוד כחלק ממערכת ההפעלה". על-ידי כברירת מחדל, תהליך Aspnet_wp.exe פועל תחת חשבון מחשב בשם ASPNET. עם זאת, חשבון זה אינו כולל את ההרשאות הנדרשות כדי להתחזות משתמש ספציפי. מתקבלת הודעת שגיאה בעת ניסיון להתחזות משתמש ספציפי. מידע זה חל רק על .NET Framework 1.0. פעולה זו לא נדרשת הרשאה עבור .NET Framework 1.1.

כדי לעקוף את בעיה זו, השתמש באחת מהשיטות הבאות:
  • הענק הרשאת "תפקוד כחלק ממערכת ההפעלה" לחשבון ASPNET (חשבון מורשה לפחות).

    הערה למרות שבאפשרותך להשתמש בשיטה זו כדי לעקוף את הבעיה, Microsoft אינה ממליצה על שיטה זו.
  • לשנות את החשבון שמופעלים על-ידי תהליך Aspnet_wp.exe תחת למערכת חשבון במקטע תצורת <processModel> הקובץ machine. config.</processModel>

התחזות לאימות המשתמש בקוד

כדי להתחזות למשתמש המאמת (User.Identity) בלבד בעת הפעלת מקטע מסוים של קוד, באפשרותך להשתמש קוד להמשך. שיטה זו מחייבת אימות זהות המשתמש הוא מסוג 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()

'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();
				
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 = 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
        '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 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"))
	{
		//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>
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>
				
הערה הזהות של התהליך שבו מתחזה משתמש מסוים על הליך משנה דרושה הרשאת "תפקוד כחלק ממערכת ההפעלה" אם התהליך Aspnet_wp.exe פועל במחשב מבוסס Microsoft Windows 2000. את "תפקוד כחלק ממערכת ההפעלה" ההרשאה אינו הכרחי אם Aspnet_wp.exe התהליך פועל במחשב מבוסס Windows XP או ב- Windows Server מחשב מבוסס-2003. כברירת מחדל, Aspnet_wp.exe התהליך פועל תחת חשבון מחשב בשם ASPNET. עם זאת, חשבון זה אינה אין לך הרשאות מתאימות כדי להתחזות למשתמש מסוים. אתה מקבל הודעת שגיאה בעת ניסיון להתחזות למשתמש מסוים. .

כדי לעקוף בעיה זו, השתמש באחת מהשיטות הבאות:
  • הענק הרשאת "תפקוד כחלק ממערכת ההפעלה" לחשבון ASPNET.

    הערה אנו לא ממליצים על שיטה זו כדי לעקוף בעיה.
  • לשנות את החשבון שמופעלים על-ידי תהליך Aspnet_wp.exe תחת למערכת חשבון במקטע תצורת <processModel> הקובץ machine. config.</processModel>

מידע נוסף

לקבלת מידע נוסף אודות אבטחת ASP.NET, לחץ על מספר המאמר שלהלן כדי להציג את המאמר ב- מתוך Microsoft Knowledge Base:
306590מבט כולל על אבטחת ASP.NET

מאפיינים

Article ID: 306158 - Last Review: יום חמישי 06 יוני 2013 - Revision: 1.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 KbMthe
תרגום מכונה
חשוב: מאמר זה תורגם באמצעות תוכנת תרגום מכונה של Microsoft וייתכן שנערך לאחר מכן על-ידי קהילת Microsoftבאמצעות טכנולוגייתCommunity Translation Framework (CTF) או באמצעות תרגום אנושי. Microsoft מציעה לך גם מאמרים בתרגום אנושי, מאמרים בתרגום מכונה ומאמרים שנערכו על ידי הקהילה כדי לאפשר גישה למאמרים הקיימים במאגר הידע (Knowledge Base) שלMicrosoft בשפות שונות. מאמרים מתורגמים יכולים להכיל שגיאות באוצר המילים, בתחביר או בדקדוק. Microsoft אינה אחראית לחוסר דיוק, שגיאות או נזקים שייגרמו כתוצאה מטעויות בתכנים או משימוש בתכנים על ידי לקוחותיה.
כותרת מאמר זה באנגלית: 306158

ספק משוב

 

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