אינך במצב לא מקוון כעת, ממתין לחיבור לאינטרנט

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

חשוב: מאמר זה תורגם באמצעות תוכנת תרגום מכונה של Microsoft וייתכן שנערך לאחר מכן על-ידי קהילת Microsoftבאמצעות טכנולוגייתCommunity Translation Framework (CTF) או באמצעות תרגום אנושי. Microsoft מציעה לך גם מאמרים בתרגום אנושי, מאמרים בתרגום מכונה ומאמרים שנערכו על ידי הקהילה כדי לאפשר גישה למאמרים הקיימים במאגר הידע (Knowledge Base) שלMicrosoft בשפות שונות. מאמרים מתורגמים יכולים להכיל שגיאות באוצר המילים, בתחביר או בדקדוק. Microsoft אינה אחראית לחוסר דיוק, שגיאות או נזקים שייגרמו כתוצאה מטעויות בתכנים או משימוש בתכנים על ידי לקוחותיה.

כותרת מאמר זה באנגלית: 306158
מאמר זה מתייחס Microsoft .NET הבאה ספריית המחלקות framework טווחי שמות:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
תקציר
מאמר זה מתאר דרכים שונות כדי ליישם התחזות ביישום 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.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();				
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>
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
הכניסה נכשלה null (null) להתחזות

אזהרה: מאמר זה תורגם באופן אוטומטי.

מאפיינים:

מזהה פריט: 306158 - סקירה אחרונה: 06/06/2013 23:54:00 - תיקון: 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
משוב