لقد نجحت ذات مرة في إنشاء مجموعة من حسابات المجال باستخدام صناديق البريد باستخدام برنامج Windows، ومع ذلك، عندما أعطيت هذا الرمز لأحد زملائي (كانت مسؤولة عن تطوير تطبيقات الويب) وقمت بترحيله إلى asp.net، لم يكن بإمكانه سوى إنشاء المجال. الحساب، لا يمكن إنشاء صندوق بريد. لماذا؟
لقد استشرنا أحد مهندسي Microsoft وأخبرنا أن هذا يرجع إلى عدم كفاية أذونات asp.net، ويجب علينا محاكاة المستخدم في asp.net حتى يمكن إنشاؤه بنجاح.
لقد قمت باقتباس المقالات ذات الصلة من Microsoft:
انتحال شخصية حساب أو مستخدم IIS مصادق عليه
لانتحال شخصية مستخدم خدمات معلومات الإنترنت لـ Microsoft (IIS) المصادق عليه عند تلقي كل طلب لكل صفحة في تطبيق ASP.NET، يجب عليك تضمين علامة <identity> في ملف Web.config لهذا التطبيق وقم بتعيين سمة الانتحال إلى true. على سبيل المثال:
<identity impersonate="true" />
انتحال شخصية مستخدم معين لجميع الطلبات إلى تطبيق ASP.NET
لانتحال شخصية مستخدم محدد لجميع الطلبات على كافة صفحات تطبيق ASP.NET، يمكنك تحديد سمة اسم المستخدم وكلمة المرور. على سبيل المثال:
<identity impersonate = "true" userName = "اسم الحساب" كلمة المرور = "كلمة المرور" />
ملاحظة: هوية العملية التي تنتحل شخصية مستخدم معين في سلسلة محادثات يجب أن يكون لديها إذن "كجزء من نظام التشغيل". افتراضيًا، يتم تشغيل عملية Aspnet_wp.exe ضمن حساب كمبيوتر يُسمى ASPNET. ومع ذلك، لا يملك هذا الحساب الأذونات اللازمة لانتحال شخصية مستخدم معين. إذا حاولت انتحال شخصية مستخدم معين، ستظهر رسالة خطأ.
لحل هذه المشكلة، استخدم إحدى الطرق التالية:
منح
حساب ASPNET (الحساب الأقل امتيازًا) إذن "العمل كجزء من نظام التشغيل".
ملاحظة: على الرغم من أن هذه الطريقة قد تحل المشكلة، إلا أن Microsoft لا توصي بهذه الطريقة.
في قسم التكوين <processModel> من ملف Machine.config،
قم بتغيير الحساب الذي يتم من خلاله تشغيل عملية Aspnet_wp.exe إلى حساب النظام.
انتحال شخصية مستخدم تمت مصادقته في التعليمات البرمجية
لانتحال شخصية مستخدم تمت مصادقته (User.Identity) فقط عند تشغيل جزء معين من التعليمات البرمجية، يمكنك استخدام التعليمات البرمجية التالية. تتطلب هذه الطريقة أن يكون معرف مستخدم المصادقة من النوع WindowsIdentity.
Visual Basic .NET
Dim impersonationContext كـ System.Security.Principal.WindowsImpersonationContext
تعتيم WindowsIdentity الحالي كـ System.Security.Principal.WindowsIdentity
currentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)
impersonationContext = currentWindowsIdentity.Impersonate()
'أدخل الرمز الخاص بك الذي يتم تشغيله ضمن سياق الأمان الخاص بالمستخدم المصادق هنا.
انتحال الهويةContext.Undo()
Visual C# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;
انتحال الهوية =
((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
// أدخل الرمز الخاص بك الذي يعمل ضمن سياق الأمان الخاص بالمستخدم المصادق هنا.
impersonationContext.Undo();
Visual J# .NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;
انتحال الهوية =
((System.Security.Principal.WindowsIdentity)get_User().get_Identity()).Impersonate();
// أدخل الرمز الخاص بك الذي يعمل ضمن سياق الأمان الخاص بالمستخدم المصادق هنا.
impersonationContext.Undo();
انتحال شخصية مستخدم معين في التعليمات البرمجية
لانتحال شخصية مستخدم معين فقط عند تشغيل أجزاء معينة من التعليمات البرمجية الخاصة بك، استخدم التعليمات البرمجية التالية:
Visual Basic .NET
<%@ Page Language="VB" %>
<%@ استيراد مساحة الاسم = "System.Web" %>
<%@ استيراد مساحة الاسم = "System.Web.Security" %>
<%@ استيراد مساحة الاسم = "System.Security.Principal" %>
<%@ استيراد مساحة الاسم = "System.Runtime.InteropServices" %>
<تشغيل البرنامج النصي = الخادم>
تعتيم LOGON32_LOGON_INTERACTIVE كعدد صحيح = 2
تعتيم LOGON32_PROVIDER_DEFAULT كعدد صحيح = 0
ImpersonationContext كـ WindowsImpersonationContext
قم بتعريف الدالة LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As String، _
ByVal lpszDomain كسلسلة، _
ByVal lpszPassword كسلسلة، _
ByVal dwLogonType كعدد صحيح، _
ByVal dwLogonProvider كعدد صحيح، _
ByRef phToken As IntPtr) كعدد صحيح
قم بتعريف الوظيفة التلقائية DuplicateToken Lib "advapi32.dll" ( _
ByVal ExistingTokenHandle كـ IntPtr، _
مستوى انتحال ByVal كعدد صحيح، _
ByRef DuplicateTokenHandle كـ IntPtr) كعدد صحيح
قم بتعريف الوظيفة التلقائية RevertToSelf Lib "advapi32.dll" () طالما
قم بتعريف الوظيفة التلقائية CloseHandle Lib "kernel32.dll" (مقبض ByVal باسم IntPtr) طالما
Page_Load الفرعي العام (ByVal s ككائن، ByVal e As EventArgs)
إذا انتحل شخصيةValidUser("اسم المستخدم"، "المجال"، "كلمة المرور") ثم
'أدخل الرمز الخاص بك الذي يتم تشغيله ضمن سياق الأمان لمستخدم معين هنا.
التراجع عن الانتحال ()
آخر
"لقد فشل انتحال شخصيتك، لذلك، قم بتضمين آلية آمنة من الفشل هنا."
نهاية إذا
نهاية الفرعية
وظيفة خاصة انتحال شخصيةValidUser(ByVal userName As String, _
مجال ByVal كسلسلة، وكلمة مرور ByVal كسلسلة) كسلسلة منطقية
خافت tempWindowsIdentity مثل WindowsIdentity
رمز خافت كـ IntPtr = IntPtr.Zero
Dim tokenDuplicate As IntPtr = IntPtr.Zero
impersonateValidUser = False
إذا RevertToSelf () ثم
إذا كان LogonUserA(اسم المستخدم، المجال، كلمة المرور، LOGON32_LOGON_INTERACTIVE،
LOGON32_PROVIDER_DEFAULT، الرمز المميز) <> 0 ثم
إذا DuplicateToken(token, 2, tokenDuplicate) <> 0 ثم
tempWindowsIdentity = WindowsIdentity الجديد (tokenDuplicate)
impersonationContext = tempWindowsIdentity.Impersonate()
إذا لم يكن سياق الانتحال لا شيء إذن
impersonateValidUser = True
نهاية إذا
نهاية إذا
نهاية إذا
نهاية إذا
إذا لم يكن tokenDuplicate.Equals(IntPtr.Zero) ثم
CloseHandle(tokenDuplicate)
نهاية إذا
إذا لم يكن token.Equals(IntPtr.Zero) ثم
CloseHandle (الرمز المميز)
نهاية إذا
وظيفة النهاية
التراجع عن انتحال الشخصية الفرعية الخاصة ()
انتحال الهويةContext.Undo()
نهاية الفرعية
</script>
Visual C# .NET
<%@ Page Language="C#"%>
<%@ استيراد مساحة الاسم = "System.Web" %>
<%@ استيراد مساحة الاسم = "System.Web.Security" %>
<%@ استيراد مساحة الاسم = "System.Security.Principal" %>
<%@ استيراد مساحة الاسم = "System.Runtime.InteropServices" %>
<تشغيل البرنامج النصي = الخادم>
البنية العامة int LOGON32_LOGON_INTERACTIVE = 2؛
البنية العامة int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll")]
عام ثابت خارجي int LogonUserA (سلسلة lpszUserName،
سلسلة lpszDomain,
سلسلة lpszPassword،
إنت dwLogonType,
إنت dwLogonProvider,
المرجع IntPtr phToken);
[DllImport("advapi32.dll"، CharSet=CharSet.Auto، SetLastError=true)]
خارجي ثابت عام int DuplicateToken (IntPtr hToken،
مستوى انتحال الشخصية,
المرجع IntPtr hNewToken);
[DllImport("advapi32.dll"، CharSet=CharSet.Auto، SetLastError=true)]
المنطق المنطقي الخارجي الثابت العام RevertToSelf();
[DllImport("kernel32.dll"، CharSet=CharSet.Auto)]
المنطق المنطقي الخارجي الثابت العام CloseHandle(IntPtr Handle);
Page_Load (Object s، EventArgs e) باطلة عامة
{
إذا (impersonateValidUser("اسم المستخدم"، "المجال"، "كلمة المرور"))
{
// أدخل الرمز الخاص بك الذي يعمل ضمن سياق الأمان لمستخدم معين هنا.
undoImpersonation();
}
آخر
{
// فشل انتحال هويتك، لذلك، قم بتضمين آلية آمنة من الفشل هنا.
}
}
منطقي خاص impersonateValidUser (اسم مستخدم السلسلة، مجال السلسلة، كلمة مرور السلسلة)
{
WindowsIdentity tempWindowsIdentity;
رمز IntPtr = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
إذا (العودة إلى الذات ())
{
إذا (LogonUserA (اسم المستخدم، المجال، كلمة المرور، LOGON32_LOGON_INTERACTIVE،
LOGON32_PROVIDER_DEFAULT، الرمز المميز) != 0)
{
إذا (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
إذا (انتحال كونتيكست! = فارغ)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
عودة صحيحة؛
}
}
}
}
إذا (الرمز المميز! = IntPtr.Zero)
CloseHandle(token);
إذا (tokenDuplicate!=IntPtr.Zero)
CloseHandle(tokenDuplicate);
عودة كاذبة.
}
التراجع عن انتحال الشخصية بفراغ خاص ()
{
impersonationContext.Undo();
}
</script>
Visual J# .NET
<%@ لغة الصفحة = "VJ#" %>
<%@ استيراد مساحة الاسم = "System.Web" %>
<%@ استيراد مساحة الاسم="System.Web.Security" %>
<%@ استيراد مساحة الاسم = "System.Security.Principal" %>
<%@ Import Namespace="System.Runtime.InteropServices" %>
<تشغيل البرنامج النصي = الخادم>
كثافة العمليات العامة الثابتة LOGON32_LOGON_INTERACTIVE = 2؛
عدد صحيح عام ثابت LOGON32_PROVIDER_DEFAULT = 0؛
WindowsImpersonationContext impersonationContext;
/** @attribute DllImport("advapi32.dll") */
عام ثابت أصلي int LogonUserA (سلسلة lpszUserName،
سلسلة lpszDomain,
سلسلة lpszPassword،
إنت dwLogonType,
إنت dwLogonProvider,
System.IntPtr[] phToken);
/** @attribute DllImport("advapi32.dll",
CharSet=CharSet.Auto، SetLastError=true) */
Int DuplicateToken الأصلي العام الثابت (System.IntPtr hToken،
مستوى انتحال الشخصية,
System.IntPtr[] hNewToken);
/** @attribute DllImport("kernel32.dll",CharSet=CharSet.Auto) */
CloseHandle المنطقية الأصلية العامة الثابتة (System.IntPtr[] Handle);
/** @attribute DllImport("advapi32.dll",
CharSet=CharSet.Auto,SetLastError=true) */
المنطق المنطقي الأصلي العام RevertToSelf();
Page_Load (Object s، System.EventArgs e) باطلة عامة
{
إذا (impersonateValidUser("اسم المستخدم"، "المجال"، "كلمة المرور"))
{
// أدخل الرمز الخاص بك الذي يعمل ضمن سياق الأمان لمستخدم معين هنا.
undoImpersonation();
}
آخر
{
// فشل انتحال هويتك، لذلك، قم بتضمين آلية آمنة من الفشل هنا.
}
}
انتحال شخصية منطقية خاصة (اسم مستخدم السلسلة، مجال السلسلة، كلمة مرور السلسلة)
{
WindowsIdentity tempWindowsIdentity;
System.IntPtr[] token = new System.IntPtr[1];
System.IntPtr[] tokenDuplicate = new System.IntPtr[1];
إذا (العودة إلى الذات ())
{
إذا (LogonUserA (اسم المستخدم، المجال، كلمة المرور، LOGON32_LOGON_INTERACTIVE،
LOGON32_PROVIDER_DEFAULT، الرمز المميز) != 0)
{
إذا (DuplicateToken(token[0], 2, tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate[0]);
impersonationContext = tempWindowsIdentity.Impersonate();
إذا (انتحال كونتيكست! = فارغ)
{
CloseHandle(tokenDuplicate);
CloseHandle(token);
عودة صحيحة؛
}
}
}
}
إذا (!token[0].Equals(System.IntPtr.Zero))
CloseHandle(token);
إذا (!tokenDuplicate[0).Equals(System.IntPtr.Zero))
CloseHandle(tokenDuplicate);
عودة كاذبة.
}
التراجع عن انتحال الشخصية بفراغ خاص ()
{
impersonationContext.Undo();
}
</script>
ملاحظة: هوية العملية التي تنتحل شخصية مستخدم معين في سلسلة محادثات يجب أن يكون لديها إذن "كجزء من نظام التشغيل". افتراضيًا، يتم تشغيل عملية Aspnet_wp.exe ضمن حساب كمبيوتر يُسمى ASPNET. ومع ذلك، لا يملك هذا الحساب الأذونات اللازمة لانتحال شخصية مستخدم معين. إذا حاولت انتحال شخصية مستخدم معين، ستظهر رسالة خطأ.
لحل هذه المشكلة، استخدم إحدى الطرق التالية:
منح
حساب ASPNET الإذن "التصرف كجزء من نظام التشغيل".
في قسم التكوين <processModel> من ملف Machine.config،
قم بتغيير الحساب الذي يتم من خلاله تشغيل عملية Aspnet_wp.exe إلى حساب النظام.