لماذا وكيف يتم إعادة استخدام معرفات جلسة العمل في ASP.NET

مقدمة

توضح هذه المقالة كيف و لماذا يتم استخدام معرفات جلسة عمل Microsoft ASP.NET.

مزيد من المعلومات

حالة جلسة عمل ASP.NET هي تقنية تسمح لك بتخزين البيانات الخاصة بالمستخدم والخادم. تطبيقات ويب استخدام هذه البيانات لمعالجة الطلبات الواردة من المستخدم الذي تم إنشاء حالة جلسة العمل. حالة جلسة عمل مستخدم تم تعريفها بواسطة معرف جلسة عمل. يتم تسليم معرف جلسة العمل باستخدام أحد الأساليب التالية:
  • معرف جلسة العمل هو جزء من ملف تعريف الارتباط التي يتم إرسالها إلى المستعرض الخاص بالمستخدم.
  • يتم تضمين معرف جلسة العمل في محدد موقع المعلومات. يعرف هذا الأسلوب أيضا أقل ملف تعريف ارتباط جلسة العمل.
معرفات جلسة العمل هي رقم عشوائي 120 بت المتمثلة في سلسلة أحرف 20. يتم تنسيق السلسلة يمكن تضمينه في عنوان URL وليس بالخضوع لترميز URL. على سبيل المثال، قد يمكن استخدام السلسلة في جلسات أقل ملف تعريف الارتباط. طريقة شائعة لتسليم معرفات جلسة العمل باستخدام ملفات تعريف الارتباط لتخزين معرفات جلسة العمل.

عندما يقوم مستخدم أولاً بفتح مستعرض ويب والانتقال إلى أحد مواقع ويب التي تقوم بتنفيذ حالة جلسة عمل ASP.NET، يتم إرسال ملف تعريف ارتباط إلى المستعرض باسم "ASP.NET_SessionId" وقيمة 20 حرف.

عندما يستعرض المستخدم داخل نفس المجال DNS، يستمر مستعرض ويب لإرسال ملف cookie هذا إلى المجال الذي تم توريد.

على سبيل المثال، app1.tailspintoys.com و app2.tailspintoys.com كل من تطبيقات ASP.NET. إذا كان المستخدم الانتقال إلى app1.tailspintoys.com والانتقال إلى app2.tailspintoys.com، سيستخدم كلا التطبيقين نفس ملف تعريف الارتباط ونفس معرف جلسة العمل لتعقب حالة جلسة العمل للمستخدم في كل تطبيق. عدم مشاركة التطبيقات نفس حالة جلسة العمل. مشاركة التطبيقات فقط من معرف جلسة العمل.

لذلك، يمكنك إعادة استخدام معرفات جلسة العمل لعدة أسباب. على سبيل المثال، إذا تم إعادة استخدام معرفات جلسة العمل، لم تكن للقيام بما يلي:
  • إنشاء معرف جلسة عمل فريد التشفير جديد عندما تقدم إليك مع معرف جلسة عمل صالح.
  • إنشاء معرف جلسة عمل جديدة لكل تطبيق ASP.NET في مجال واحد.
عند تطبيق ويب يتطلب تسجيل دخول ويوفر تسجيل خروج الصفحة أو الخيار، نوصي بإزالة حالة جلسة العمل عند قيام المستخدم بتسجيل الخروج من موقع ويب. لمسح حالة جلسة العمل، قم باستدعاء الأسلوب Session.Abandon . أسلوب Session.Abandon يتيح لك مسح حالة جلسة العمل دون انتظار مهلة حالة جلسة العمل. بشكل افتراضي، هذه المهلة انتهاء صلاحية انزلاق 20 دقيقة. انتهاء صلاحية هذا تحديث كل مرة أن المستخدم طلبا إلى موقع ويب ويعرض ملف تعريف ارتباط معرف جلسة العمل. تعيين أسلوب التخلي عن إشارة في كائن حالة جلسة العمل تشير إلى أنه ينبغي التخلي عن حالة جلسة العمل. دراسة العلم وثم بموجبها في نهاية طلب الصفحة. لذلك، يمكن استخدامها كائن جلسة عمل داخل الصفحة بعد استدعاء أسلوب التخلي عن . بمجرد اكتمال معالجة الصفحة، تتم إزالة جلسة العمل.

عند استخدام وضع حالة جلسة العمل قيد التشغيل، يتم تخزين كائنات حالة جلسة العمل هذه في هتبكاتشي. يدعم هتبكاتشي أسلوب رد اتصال إذا تحققت الشروط التالية:
  • إزالة إدخال ذاكرة التخزين المؤقت.
  • إدارة حالة جلسة عمل تسجيل معالج الحدث Session_OnEnd ليتم استدعاؤه عند إزالة إدخال ذاكرة التخزين المؤقت.
عند إزالة "إدارة حالة جلسة عمل" كائن حالة جلسة عمل موجودة في ذاكرة التخزين المؤقت، سيتم استدعاء إدارة هتبكاتشي أي عمليات الاسترجاعات المسجلة. في الواقع، يثير هذا السلوك Session_OnEnd معالج الأحداث.

عند التخلي عن جلسة عمل، لا تتم إزالة ملف تعريف ارتباط معرف جلسة العمل من مستعرض المستخدم. لذلك، كما تم التخلي عن جلسة العمل، أي طلبات جديدة لنفس التطبيق سيقوم باستخدام نفس معرف جلسة العمل ولكن مثيل حالة جلسة عمل جديدة. في نفس الوقت، في حالة قيام المستخدم بفتح تطبيق آخر داخل نفس المجال DNS المستخدم لن تفقد حالة جلسة العمل الخاصة بهم بعد استدعاء أسلوب التخلي عن من تطبيق واحد.

في بعض الأحيان، قد لا تحتاج إلى إعادة استخدام معرف جلسة العمل إذا قمت بذلك وإذا فهمت عواقب عدم إعادة استخدام معرف جلسة العمل، استخدم مثال التعليمات البرمجية التالي للتخلي عن جلسة عمل وقم بإلغاء تحديد ملف تعريف ارتباط معرف جلسة العمل:
Session.Abandon();Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
مثال التعليمات البرمجية هذا بمسح حالة جلسة العمل من الملقم وتعيين ملف تعريف ارتباط حالة جلسة العمل إلى null. قيمة فارغة فعالية مسح ملفات تعريف الارتباط من المستعرض.

عند عدم تسجيل مستخدم الخروج من التطبيق ومهله حالة جلسة العمل, التطبيق قد لا تزال تستخدم نفس جلسة العمل حالة ملف تعريف الارتباط إذا لم يتم إغلاق المستعرض. يؤدي هذا السلوك المستخدم يتم توجيهك إلى صفحة تسجيل الدخول وملف تعريف الارتباط حالة جلسة العمل للمستخدم لتقديمها. لضمان أنه يتم استخدام معرف جلسة عمل جديد عند فتح صفحة تسجيل الدخول (login.aspx)، إرسال ملف تعريف ارتباط فارغ إلى العميل. للقيام بذلك، إضافة ارتباط إلى مجموعة الاستجابة. وبعد ذلك، إرسال المجموعة استجابة إلى العميل. أسهل طريقة لإرسال ملف تعريف ارتباط فارغ باستخدام أسلوب Response.Redirect . بسبب مجموعة ملفات تعريف الارتباط دائماً قيمة ASP.NET_SessionId، لا مجرد اختبار في حالة وجود ملف تعريف الارتباط هذا لأنه يتم إنشاء حلقة Response.Redirect . يمكنك تعيين سلسلة استعلام في إعادة التوجيه إلى صفحة تسجيل الدخول.

أو، كما هو موضح في مثال التعليمات البرمجية التالي، يمكنك استخدام ملف تعريف ارتباط مختلف لمعرفة ما إذا كان الفعل توجيهك إلى صفحة تسجيل الدخول. للمساعدة على تحسين الأمان والتأكد من أن أي شخص يحاول فتح صفحة تسجيل الدخول باستخدام ملف تعريف ارتباط ثاني جنبا إلى جنب مع ملف تعريف الارتباط ASP.NET يستخدم مثال التعليمات البرمجية التالي فئة FormsAuthentication لتشفير وفك تشفير بيانات ملف تعريف الارتباط. وبعد ذلك، يعين مثال التعليمات البرمجية مهلة ثانية 5.
private void Page_Load(object sender, System.EventArgs e){ 
if( !IsPostBack &&
( Request.Cookies["__LOGINCOOKIE__"] == null ||
Request.Cookies["__LOGINCOOKIE__"].Value == "" ) )
{
//At this point, we do not know if the session ID that we have is a new
//session ID or if the session ID was passed by the client.
//Update the session ID.

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

//To make sure that the client clears the session ID cookie, respond to the client to tell
//it that we have responded. To do this, set another cookie.
AddRedirCookie();
Response.Redirect( Request.Path );
}

//Make sure that someone is not trying to spoof.
try
{
FormsAuthenticationTicket ticket =
FormsAuthentication.Decrypt( Request.Cookies["__LOGINCOOKIE__"].Value );

if( ticket == null || ticket.Expired == true )
throw new Exception();

RemoveRedirCookie();
}
catch
{
//If someone is trying to spoof, do it again.
AddRedirCookie();
Response.Redirect( Request.Path );
}


Response.Write("Session.SessionID="+Session.SessionID+"<br/>");
Response.Write("Cookie ASP.NET_SessionId="+Request.Cookies["ASP.NET_SessionId"].Value+"<br/>");
}

private void RemoveRedirCookie()
{
Response.Cookies.Add(new HttpCookie("__LOGINCOOKIE__", ""));
}

private void AddRedirCookie()
{

FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(1,"Test",DateTime.Now,DateTime.Now.AddSeconds(5), false,"");
string encryptedText = FormsAuthentication.Encrypt( ticket );
Response.Cookies.Add( new HttpCookie( "__LOGINCOOKIE__", encryptedText ) );
}

خصائص

رقم الموضوع: 899918 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات