هل يمكنني التخلي عن جلسة InProc ASP.NET من جلسة مختلفة عن تلك التي تقدم الطلب؟

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

سؤال

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

من المتوقع أن يقوم كل تطبيق بتسجيل ربط تسجيل الخروج (URL) مع CAS في وقت تسجيل الدخول إلى هذا التطبيق.عندما تتلقى CAS طلب تسجيل الخروج من أحد التطبيقات، فإنها تستدعي ربط تسجيل الخروج لجميع التطبيقات التي تشارك تذكرة SSO.

سؤالي هو هذا:هل هناك طريقة للتخلي عن جلسة InProc من جلسة مختلفة؟أفترض أنه نظرًا لأن طلب HTTP سيأتي من خادم CAS، فإنه سيحصل على جلسة خاصة به، ولكن جلسة المستخدم هي التي أريد إنهاءها.لدي فكرة جيدة عن كيفية القيام بذلك باستخدام خادم حالة جلسة منفصلة، ​​ولكن أود أن أعرف ما إذا كان من الممكن استخدام حالة جلسة InProc.

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

المحلول 2

بعد إجراء القليل من البحث والنظر في الإجابات المقدمة حتى الآن، توصلت إلى بديل يسمح لي بمواصلة استخدام جلسة InProc.بشكل أساسي، يتكون من توسيع HttpModule الذي يتعامل بالفعل مع تسجيل الدخول الموحد لتسجيلات خروج CAS المكتشفة وإعادة توجيه المتصفح إلى صفحة تسجيل الخروج من التطبيق.

الخطوط العريضة:

سجل دخولك:

  1. لكل طلب تسجيل دخول فردي جديد، قم بإنشاء ملف تعريف ارتباط SSO جديد وقم بتشفير قيمة فريدة فيه لتحديد الجلسة (وليس معرف الجلسة، حتى لا يتم تسريبه).
  2. أنشئ عنوان url لرد الاتصال لتسجيل الخروج، المشفر بالمعرف، وقم بتسجيله في خادم CAS.

خروج:

  1. عند تلقي طلب تسجيل الخروج من خادم CAS، قم بفك تشفير المعرف وتخزينه في ذاكرة تخزين مؤقت على مستوى التطبيق.يجب تثبيت هذا في ذاكرة التخزين المؤقت على الأقل لفترة كافية حتى تنتهي الجلسة بشكل طبيعي.
  2. بالنسبة لكل طلب، ابحث عن ملف تعريف الارتباط SSO وتحقق من قيمته مقابل معرفات الجلسة المخزنة مؤقتًا والتي تم تسجيل الخروج منها.في حالة حدوث نتيجة، قم بإزالة ملف تعريف الارتباط SSO وأعد توجيه المتصفح إلى عنوان URL لتسجيل الخروج الخاص بالتطبيق.
  3. لكل تسجيل خروج، تحقق لمعرفة ما إذا كان هناك ملف تعريف ارتباط SSO، إذا كان الأمر كذلك، قم بإعادة توجيه طلب تسجيل الخروج إلى CAS.وعلى أية حال، قم بإلغاء جلسة المستخدم، وقم بتسجيل خروجه من التطبيق.

تحميل الصفحة:

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

نصائح أخرى

وهاها، حسنا ... يبدو أنك يمكن. وكنت أتساءل نفسي إذا كان هناك أي طريقة للقيام بذلك، تبين، هناك.

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

using System;
using System.Reflection;
using System.Web;

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null, null);

if (obj != null)
{
    MethodInfo remove = obj.GetType()
        .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
            Type.DefaultBinder, new Type[] { typeof(string) }, null);

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}

والنتيجة النهائية هي أن الطلب التالي سيأخذ في نفس جلسة الهوية، ولكن HttpSessionState سوف يكون فارغا. عليك لا يزال الحصول على الأحداث Session_Start وSession_End.

ومع InProc SessionState، فلن تكون قادرا على الوصول إلى البيانات ... مع StateServer، لا يزال سوف يكون سيناريو لزجة يحاول الوصول إلى API الصحيح لإزالة الدورة.

وأنت من المرجح أن ترغب في استخدام قاعدة بيانات المدعومة من حل الدولتين مثل مزود الدولة SQLSERVER المعبأة مسبقا أو حل طرف ثالث مثل DOTSS: <لأ href = "http://codeplex.com/dotss" يختلط = "نوفولو noreferrer "> http://codeplex.com/dotss

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

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