2009-05-19 13 views
12

मैं की तरह विन्यास के साथ एक ASP.NET वेब साइट FormsAuthentication का उपयोग करता है और एक मानक सत्र तंत्र का निर्माण कर रहा हूँ:कैसे फॉर्म प्रमाणीकरण कुकी और Asp.Net सत्र के जीवनकाल सिंक्रनाइज़ करने के लिए?

<authentication mode="Forms"> 
    <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/> 
</authentication> 
... 
<sessionState timeout="20" cookieless="UseCookies" /> 

ऐसा लगता है कि एक प्रमाणीकरण कुकी के जीवनकाल उपयोगकर्ता सत्र के जीवनकाल के बराबर नहीं है। तो ASP.NET गारंटी नहीं है कि

  1. सत्र समाप्त हो जाता है जब उपयोगकर्ता लॉगआउट,

  2. सत्र उपयोगकर्ता लॉगआउट से पहले समाप्त हो जाता है नहीं है।

वहाँ FormsAuthentication या \ और इन लक्ष्यों तक पहुंचने के लिए सत्र स्थिति तंत्र अनुकूलित करने के लिए कोई तरीका है?

उत्तर

6

कोई अंतर्निहित तंत्र नहीं है क्योंकि वास्तविकता यह है कि आप उपयोगकर्ताओं को अपने सत्रों को चारों ओर रखने के लिए लंबे समय तक लॉग इन रखना चाहते हैं। साथ ही, सत्रों को गारंटीकृत भंडारण के लिए नहीं माना जाता है, और आपको सत्र में होने वाले डेटा पर निर्भरता से बचना चाहिए।

प्रमाणीकरण कुकी समाप्त होने पर सर्वर पर कुछ भी नहीं होता है। कोई ट्रैक राज्य नहीं है।

आपके पास 'लॉगआउट' लिंक हो सकता है और हैंडलर Abandon सत्र और SignOut फॉर्म प्रमाणीकरण से हो सकता है, लेकिन ऐसा कुछ भी नहीं है जो किसी उपयोगकर्ता को वेबसाइट से लॉग आउट करने के लिए मजबूर करता हो।

सत्र जैसे कुछ लोग, हालांकि अधिकांश नफरत करते हैं या इससे नफरत करते हैं क्योंकि इसका उपयोग दुर्व्यवहार किया जाता है। मुख्य कारण हैं कि सत्र का उपयोग खराब प्रदर्शन करने वाले सर्वरों का कारण बनता है, और गलत सत्र का उपयोग उन वेबसाइटों को बना सकता है जो स्केल नहीं करेंगे।

यदि आप कर सकते हैं तो सत्र के उपयोग से बचें, और यदि आपको इसका उपयोग करना है, तो एमएसडीएन आलेख Improving ASP.NET Performance में अनुशंसाओं का पालन करें। Understanding session state modes + FAQ पर और विशेष रूप से पर एक प्रश्न देखें प्रश्न: सत्र_इंड क्यों नहीं निकाला गया है?

9

मैंने इस सवाल को कई बार सुना है, मेरा जवाब आमतौर पर "आप यह क्यों चाहते हैं?"। किसी को दूसरे की आवश्यकता नहीं होती है और उनके समाप्ति समय को विभिन्न मानदंडों का उपयोग करके निर्धारित किया जाना चाहिए।

सत्र स्थिति में उपयोगकर्ता को लॉग इन करने की आवश्यकता नहीं होती है। एक ऐप को सत्र स्थिति का उपयोग करने के लिए प्रमाणीकरण का उपयोग करने की आवश्यकता नहीं होती है। आपके पास एक वेब ऐप हो सकता है जहां उपयोगकर्ता लॉग इन करने से पहले भी सत्र स्थिति का उपयोग कर रहा है, और फिर भी लॉग आउट करने के बाद इसका उपयोग कर रहा है। यहां एक "सत्र" तब होता है जब कोई ग्राहक (वेब ​​ब्राउज़र) किसी साइट से कनेक्ट होता है, कुछ पृष्ठों के आसपास कूदता है, और पत्तियां। चाहे कोई उपयोगकर्ता लॉग इन है या नहीं, अप्रासंगिक है। यदि आप अपना ब्राउज़र बंद करते हैं, तो एक नया खोलें, और साइट पर वापस जाएं, एक नया सत्र बनाया गया है। लेकिन सर्वर नहीं जानता कि आपने अपनी पुरानी ब्राउज़र विंडो बंद कर दी है, इसलिए मूल सत्र अभी भी मौजूद है। स्केलेबिलिटी (मुख्य रूप से स्मृति) उद्देश्यों के लिए, हम अपने सत्र समाप्त कर देते हैं और इसकी स्मृति और सत्र-ट्रैकिंग संसाधनों को मुक्त करते हैं। यदि कोई ग्राहक नया अनुरोध करने में बहुत लंबा समय लेता है, तो नया अनुरोध एक नया सत्र तैयार करेगा।

दूसरी ओर, आप प्रमाणीकरण का उपयोग कर सकते हैं और सत्र स्थिति का उपयोग नहीं कर सकते हैं। मैं आम तौर पर दोनों सत्रों और व्यूस्टेट अक्षम दोनों के साथ अपने ऐप्स शुरू करता हूं और केवल तभी सक्षम होता है जब वास्तव में आवश्यक हो और पृष्ठ-दर-पृष्ठ आधार पर (या व्यूस्टेट के लिए नियंत्रण-नियंत्रण)।

सत्र समाप्ति समय प्रत्येक सत्र द्वारा उपयोग की जाने वाली स्मृति, वेब सर्वर पर उपलब्ध स्मृति, समवर्ती उपयोगकर्ताओं की संख्या और अन्य स्केलेबिलिटी आवश्यकताओं द्वारा निर्धारित किया जाना चाहिए। यह आमतौर पर कुछ मिनटों की सीमा में एक घंटे तक होता है।

प्रमाणीकरण क्लाइंट पर एक कुकी के रूप में जारी रखा जाता है और मूल रूप से सर्वर के किसी भी संसाधन का उपभोग नहीं करता है। स्केलेबिलिटी-वार, लॉगिन समाप्ति आमतौर पर सत्र समाप्ति से अधिक हो सकती है। वास्तव में एक उपयोगकर्ता अनिश्चित काल तक लॉग इन रह सकता है। जब प्रमाणीकरण की समाप्ति कम रखी जाती है, तो यह आमतौर पर सुरक्षा कारणों से होती है। यदि आप अपने कंप्यूटर से 15 मिनट तक दूर नहीं जाते हैं, तो आप नहीं चाहते हैं कि आपका बैंक वेब साइट खाता किसी और के लिए उपलब्ध हो, है ना? आप जीमेल या फेसबुक में लॉग इन कर सकते हैं और "मुझे याद रखें" का चयन कर सकते हैं और कुछ दिनों बाद वापस आ सकते हैं और आप अभी भी लॉग इन हैं। लेकिन निश्चित रूप से यह एक नया सत्र होगा क्योंकि कुछ वेब एप को कुछ के लिए सत्र डेटा पर नहीं रखना चाहिए दिन।

अब, मैंने देखा है कि बहुत से लोग प्रमाणीकरण और सत्र की समाप्ति के लिए समान अवधि का उपयोग करते हैं। और जब उपयोगकर्ता लॉग आउट करता है तो कई लोग अपने सत्र को छोड़ देते हैं() या साफ़()। लेकिन वे भूल जाते हैं कि आपको अभी भी उस मामले को प्रबंधित करने की आवश्यकता है जहां उपयोगकर्ता अभी भी लॉग इन है लेकिन सत्र समाप्त हो गया है (जो अगले अनुरोध पर नया खाली सत्र बनाता है), या जब उपयोगकर्ता का प्रमाणीकरण समाप्त हो गया लेकिन उनका सत्र नहीं (उन्हें फिर से लॉग इन करने की आवश्यकता है, लेकिन संभवतः किसी अन्य उपयोगकर्ता के संवेदनशील डेटा के साथ, पुराने पुराने समय-समय पर समाप्त होने वाले सत्र को ले जाना)। इन मामलों की देखभाल करना बहुत महत्वपूर्ण है, इससे कोई फर्क नहीं पड़ता कि आप अंततः अपने आवेदन के लिए कौन से टाइमआउट चुनते हैं।

4

कारण कभी-कभी मैं खुद से यह प्रश्न पूछता हूं, "कालबाह्य" सत्र वस्तुओं तक पहुंच को रोकने के लिए है। जब सत्र लॉगिन समाप्ति से पहले समाप्त हो जाता है, और उपयोगकर्ता उस पृष्ठ से अनुरोध करता है जो सत्र से डेटा का उपयोग करता है, तो एक बुरा नल संदर्भ अपवाद होता है।

आपको यह article सहायक मिल सकता है। यह कालबाह्य सत्रों का पता लगाने के लिए कई समाधानों पर चर्चा करता है और उपयोगकर्ता को इसके बारे में सूचित करता है।

संबंधित मुद्दे