كيف أقوم بتعيين جلسات asp.net بشكل صريح بحيث تنتهي صلاحيتها فقط عند إغلاق المتصفح أو الشعار الصريح؟

StackOverflow https://stackoverflow.com/questions/93888

  •  01-07-2019
  •  | 
  •  

سؤال

بشكل افتراضي، يبدو أن انتهاء الجلسة هو 20 دقيقة.

تحديث:لا أريد أن تنتهي صلاحية الجلسة حتى يتم إغلاق المتصفح.

التحديث2:هذا هو السيناريو الخاص بي.يقوم المستخدم بتسجيل الدخول إلى الموقع.يلعب في جميع أنحاء الموقع.يترك الكمبيوتر للاستحمام (> 20 دقيقة ;)).يعود إلى الكمبيوتر و يجب تكون قادرة على اللعب حولها.يقوم بإغلاق المتصفح، الذي يحذف ملف تعريف الارتباط للجلسة.في المرة القادمة التي يأتي فيها إلى الموقع من مثيل متصفح جديد، سيحتاج إلى تسجيل الدخول مرة أخرى.

في PHP يمكنني ضبط session.cookie_lifetime في php.ini على الصفر لتحقيق ذلك.

هل كانت مفيدة؟

المحلول

إذا كنت تريد تمديد الجلسة لأكثر من 20 دقيقة، فيمكنك تغيير الإعداد الافتراضي باستخدام مسؤول IIS أو يمكنك تعيينه في ملف web.config.على سبيل المثال، لتعيين المهلة إلى 60 دقيقة في web.config:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

يمكنك أن تفعل الشيء نفسه بالنسبة لمستخدم معين في التعليمات البرمجية باستخدام:

Session.Timeout = 60

وأيًا كانت الطريقة التي تختارها، يمكنك تغيير المهلة إلى أي قيمة تعتقد أنها معقولة للسماح للمستخدمين بالقيام بأشياء أخرى والاحتفاظ بجلستهم.

هناك سلبيات بالطبع:بالنسبة للمستخدم، هناك مشكلة أمنية محتملة تتمثل في ترك المتصفح الخاص به دون مراقبة واستمرار تسجيل الدخول عندما يبدأ شخص آخر في استخدامه.بالنسبة لك، هناك مشكلة استخدام الذاكرة على الخادم - كلما طالت الجلسات، زادت الذاكرة التي ستستخدمها في أي وقت.يعتمد ما إذا كان هذا مهمًا أم لا على الحمل على الخادم الخاص بك.

إذا كنت لا ترغب في تخمين مهلة ممتدة معقولة، فستحتاج إلى استخدام أحد الأساليب الأخرى المقترحة بالفعل، والتي تتطلب تشغيل بعض جافا سكريبت في المتصفح لإجراء اختبار اتصال الخادم بشكل دوري و/أو التخلي عن الجلسة عند إلغاء تحميل الصفحة (بشرط ألا ينتقل المستخدم إلى صفحة أخرى على موقعك بالطبع).

نصائح أخرى

يمكنك تعيين مهلة قصيرة للجلسة (على سبيل المثال، 5 دقائق) ثم جعل الصفحة تستقصي الخادم بشكل دوري، إما باستخدام Javascript لإطلاق XmlHttpRequest كل دقيقتين، أو عن طريق وجود إطار iframe مخفي يشير إلى صفحة تقوم بتحديث نفسها كل دقيقة. 2 دقيقة.

بمجرد إغلاق المتصفح، تنتهي مهلة الجلسة بسرعة كبيرة بعد ذلك حيث لن يكون هناك ما يبقيها على قيد الحياة.

هذه ليست مشكلة جديدة، فهناك العديد من السيناريوهات التي يجب التعامل معها إذا كنت تريد التعرف على جميع الطرق التي يمكن أن تنتهي بها الجلسة، فيما يلي أمثلة عامة لبعضها:

  1. تم إغلاق مثيل المتصفح أو علامة التبويب.
  2. يتنقل المستخدم بعيدًا عن موقع الويب الخاص بك باستخدام نفس مثيل المتصفح أو علامة التبويب.
  3. يفقد المستخدمون اتصالهم بالإنترنت (قد يشمل ذلك فقدان الطاقة لجهاز الكمبيوتر الخاص بالمستخدم أو أي وسيلة أخرى).
  4. يبتعد المستخدم عن الكمبيوتر (أو يتوقف بطريقة أخرى عن التفاعل مع موقعك).
  5. يفقد الخادم الطاقة/يعيد التشغيل.

يجب أن يتم التعامل مع العنصرين الأولين من قبل العميل الذي يرسل المعلومات إلى الخادم، وبشكل عام ستستخدم جافا سكريبت للانتقال إلى صفحة تسجيل الخروج التي تنتهي صلاحية الجلسة بسرعة.

تتم معالجة العنصرين الثالث والرابع عادةً عن طريق تعيين مهلة حالة الجلسة (يمكن أن تكون أي فترة زمنية).يعتمد مقدار الوقت الذي تستخدمه على إيجاد قيمة تسمح للمستخدمين باستخدام موقعك دون إرباك الخادم.يمكن أن تكون القاعدة العامة التقريبية 30 دقيقة زائد أو ناقص 10 دقائق.ومع ذلك، ربما يجب أن تكون القيمة المناسبة موضوعًا لمنشور آخر.

يتم التعامل مع العنصر الخامس بناءً على كيفية تخزين جلساتك.لن تنجو الجلسات المخزنة في الحالة من إعادة التشغيل نظرًا لوجودها في ذاكرة الوصول العشوائي للكمبيوتر.ستظل الجلسات المخزنة في قاعدة بيانات أو ملف تعريف الارتباط موجودة بعد إعادة التشغيل.يمكنك التعامل مع هذا كما تراه مناسبًا.

في تجربتي المحدودة عندما ظهرت هذه المشكلة من قبل، فقد تقرر أن مجرد تعيين مهلة الجلسة إلى قيمة مقبولة هو كل ما هو مطلوب.على اية حال، ممكن أن ينتهي.

هذا هو الافتراضي.عندما يكون لديك جلسة، فإنه يخزن الجلسة في "ملف تعريف ارتباط الجلسة"، والذي يتم حذفه تلقائيًا عند إغلاق المتصفح.

إذا كنت تريد أن تكون الجلسة بين جلستين للمتصفح، فيجب عليك تعيين ملف تعريف الارتباط. انتهت الصلاحية على تاريخ في الميزة.

لأن الجلسة التي تتحدث عنها يتم تخزينها بواسطة الخادم، وليس العميل، فلا يمكنك فعل ما تريد.

لكن ضع في اعتبارك عدم استخدام الجلسة من جانب خادم ASP.NET، والاعتماد بدلاً من ذلك على ملفات تعريف الارتباط فقط.

لسوء الحظ، نظرًا للطبيعة الصريحة للويب وحقيقة عدم وجود رابط دائم بين خادم موقع الويب ومتصفح المستخدم، فمن المستحيل معرفة متى قام المستخدم بإغلاق متصفحه.هناك أحداث وجافا سكريبت يمكنك تنفيذها (على سبيل المثال.onunload) والتي يمكنك استخدامها لإجراء مكالمات مرة أخرى إلى الخادم والتي بدورها يمكن أن "تنهي" الجلسة - Session.Abandon();

يمكنك ضبط مدة مهلة الجلسة داخل web.config، تذكر أن هذه المهلة تعتمد على الوقت منذ آخر مكالمة للخادم تم إجراؤها بواسطة متصفح المستخدم.

لم تتم إضافة مهلة المتصفح.

لا توجد طريقة لمسح الجلسة بشكل صريح إذا لم تتواصل بطريقة ما بين العميل والخادم عند نقطة إغلاق النافذة، لذلك أتوقع إرسال طلب URI خاص لمسح الجلسة عند نقطة استلام النافذة رسالة قريبة.

إن Javascript الخاص بي ليس جيدًا بما يكفي لإعطائك الإرشادات الفعلية للقيام بذلك؛آسف :(

لا يمكنك ذلك، حيث لا يمكنك التحكم في كيفية استجابة عميل html.

في الواقع لماذا تحتاج إلى القيام بذلك؟طالما أنه لا يمكن لأحد التقاط الجلسة لاستخدامها مرة أخرى، فستنتهي صلاحيتها بعد مرور 20 دقيقة.إذا كانت الموارد مهمة، فقم بتعيين موعد انتهاء صلاحية أكثر قوة للجلسة (معظم شركات الاستضافة فعلت ذلك، وهو أمر مزعج للغاية) أو استخدم كائنات أقل في الجلسة.حاول تجنب أي نوع من الكائنات، وبدلاً من ذلك قم فقط بتخزين المفاتيح لاستعادتها، وهذا تصميم مهم للغاية لأنه يساعدك على توسيع نطاق جلستك إلى خادم الحالة عندما تصبح كبيرة.

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

أعتقد أن الإجابة الحقيقية على ذلك هي إعادة تقييم ما تستخدم الجلسات للقيام به.إذا كنت تستخدمها للحفاظ على الحالة، فأنا أتفق مع الإجابات الأخرى التي تقول إنك قد لا تكون محظوظًا.

ومع ذلك، فإن الطريقة المفضلة هي استخدام آلية الحالة المستمرة بنفس نطاق جلسة المتصفح، مثل ملف تعريف الارتباط الذي تنتهي صلاحيته عند إغلاق المتصفح.يمكن أن يحتوي ملف تعريف الارتباط هذا على معلومات كافية لإعادة بدء الجلسة على الخادم إذا انتهت صلاحيتها منذ آخر طلب.بالإضافة إلى مهلة الجلسة القصيرة نسبيًا (5-10 دقائق)، أعتقد أن هذا يمنحك أفضل توازن بين استخدام موارد الخادم وعدم جعل المستخدم "يعيد تشغيل" الموقع باستمرار.

اوه لقد قمت بإعادة كتابة السؤال.

هذا ممكن تمامًا، طالما أن جافا سكريبت موجودة.استخدام أياكس توقيت سوف تفعل.تحقق مع مكتبة النموذج الأولي http://www.prototypejs.org الدورية Executor أو jQuery مع البرنامج المساعد ajax + timer.قم بإعداد صفحة وهمية سيتصل بها المنفذ من وقت لآخر، بحيث تظل جلستك حية دائمًا إلا إذا قام بتسجيل الخروج (قتل مؤقت ajax في نفس الوقت) أو إغلاق المتصفح (مما يعني قتل المنفذ على أي حال)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top