أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية تنفيذ الانتحال في أحد تطبيقات ASP.NET

تشير هذه المقالة إلى مساحات الأسماء لمكتبة فئات Microsoft.NET Framework التالية:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
الموجز
تصف هذه المقالة الطرق المختلفة لتنفيذ الانتحال في أحد تطبيقات ASP.NET.
معلومات أخرى
إذا أردت انتحال صفة المستخدم على مؤشر ترابط في ASP.NET, يمكنك استخدام إحدى الطرق التالية، وفقًا لمتطلباتك:
ملاحظة يمكنك استخدام التعليمة البرمجية التالية لتحديد أي مستخدم يقوم مؤشر الترابط بالتنفيذ باسمه:
System.Security.Principal.WindowsIdentity.GetCurrent().Name				

انتحل صفة حساب أو مستخدم IIS مصدّق

لانتحال صفة المستخدم المصدّق لخدمات معلومات إنترنت لـ Microsoft" (IIS) على كل طلب لكل صفحة في أحد تطبيقات ASP.NET، يجب عليك تضمين علامة <هوية> في ملف Web.config لهذا التطبيق وتعيين سمة الانتحال إلى صحيح. على سبيل المثال:
<identity impersonate="true" />				
عودة إلى الأعلى

انتحال صفة مستخدم معين لكافة الطلبات لأحد تطبيقات ASP.NET

لانتحال صفة مستخدم معين لكافة الطلبات على كل الصفحات لأحد تطبيقات ASP.NET، يمكنك تحديد سمات اسم المستخدم و كلمة المرور في علامة <هوية> من ملف 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.
عودة إلى الأعلى

انتحل صفة المستخدم المصدّق في التعليمة البرمجية

لانتحال صفة المستخدم المصدّق (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()'ادرج التعليمة البرمجية الخاصة بك التي يتم تشغيلها ضمن سياق الأمان الخاص بالمستخدم المصدّق هنا.impersonationContext.Undo()				
Visual C# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();//ادرج التعليمة البرمجية الخاصة بك التي يتم تشغيلها ضمن سياق الأمان الخاص بالمستخدم المصدّق هنا.impersonationContext.Undo();				
Visual J# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)get_User().get_Identity()).Impersonate();//ادرج التعليمة البرمجية الخاصة بك التي يتم تشغيلها ضمن سياق الأمان الخاص بالمستخدم المصدّق هنا.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        'ادرج التعليمة البرمجية الخاصة بك التي يتم تشغيلها ضمن سياق الأمان الخاص بمستخدم معين هنا.        undoImpersonation()    آخر        'فشل الانتحال الخاص بك. لذلك، قم بتضمين آلية الأمان من الفشل هنا.    إنهاء في حالةEnd 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()                إذا لم تكن impersonationContext لا شيء إذًا                    impersonateValidUser = True                إنهاء في حالة            إنهاء في حالة        إنهاء في حالة    إنهاء في حالة    If Not tokenDuplicate.Equals(IntPtr.Zero) Then        CloseHandle(tokenDuplicate)    إنهاء في حالة    If Not token.Equals(IntPtr.Zero) Then        CloseHandle(token)    إنهاء في حالةEnd 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"))	{		//ادرج التعليمة البرمجية الخاصة بك التي يتم تشغيلها ضمن سياق الأمان الخاص بمستخدم معين هنا.		undoImpersonation();	}	else	{		//فشل الانتحال الخاص بك. لذلك، قم بتضمين آلية الأمان من الفشل هنا.	}}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"))	{		//ادرج التعليمة البرمجية الخاصة بك التي يتم تشغيلها ضمن سياق الأمان الخاص بمستخدم معين هنا.		undoImpersonation();	}	else	{		//فشل الانتحال الخاص بك. لذلك، قم بتضمين آلية الأمان من الفشل هنا.	}}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.
عودة إلى الأعلى
مراجع
للحصول على معلومات إضافية حول أمان ASP.NET، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft":
306590 نظرة عامة حول أمان ASP.NET
login failed null (null) impersonate
خصائص

رقم الموضوع: 306158 - آخر مراجعة: 08/30/2013 13:36:00 - المراجعة: 6.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
تعليقات
tml>&t=">sync=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" =4050&did=1&t=">