كيفية تنفيذ الانتحال في أحد تطبيقات 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 معلومات خدمات الإنترنت مصادقة المستخدم عند كل طلب لكل صفحة في أحد تطبيقات ASP.NET، يجب تضمين علامة < هوية > في ملف Web.config لتطبيق هذا وتعيين السمة تمثيل true. على سبيل المثال:
<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.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();

Visual 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>
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"))
{
//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.
العودة إلى أعلى

المراجع

للحصول على معلومات إضافية حول أمان ASP، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":
نظرة عامة حول أمان ASP.NET 306590

خصائص

رقم الموضوع: 306158 - آخر مراجعة: 18‏/01‏/2017 - المراجعة: 2

تعليقات