2009-05-13 20 views
10

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

सत्र समाप्त होने पर उपयोगकर्ता को लॉगिन स्क्रीन पर रीडायरेक्ट कैसे कर सकता है (इसलिए उसे एक खाली पृष्ठ नहीं दिखाई देता है) या मैं उसे उस पृष्ठ पर रीडायरेक्ट करना चाहता हूं जिसमें कहा गया है "निष्क्रियता के कारण आप लॉग आउट हो गए हैं "।

धन्यवाद

उत्तर

15

मैं अपने masterpage उपयोगकर्ता अनुप्रेषित करने में कुछ जावास्क्रिप्ट का उपयोग लॉगआउट कार्रवाई करने के लिए (एक प्रॉम्प्ट के बाद सत्र को नवीनीकृत करने)। जब सर्वर सत्र के विस्तार के लिए संवाद में बटन क्लिक करता है तो यह सर्वर साइड सत्र विंडो को रीफ्रेश करने के लिए ऐप के होम पेज पर एक AJAX अनुरोध का उपयोग करता है। संवाद के लिए jQuery और jQuery यूआई पर निर्भर करता है।

<% if (this.Request.IsAuthenticated) 
    { 
     int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes 
     int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes 
     if (ViewData["sessionTimeout"] != null) 
     { 
      sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000; 
     } 
%> 
<script type="text/javascript"> 
    var logoutTimer = null; 
    var sessionTimer = null; 
    var sessionTimeout = Number('<%= sessionTimeout %>'); 
    var sessionDialogWait = Number('<%= sessionDialogWait %>'); 

    $(document).ready(function() { 
     $('#sessionEndDialog').dialog({ 
      autoOpen: false, 
      bgiframe: true, 
      modal: true, 
      buttons: { 
       OK: function() { 
        $(this).dialog('close'); 
        $.get('<%= Url.Action("About", "Home") %>', scheduleSessionPrompt, 'html'); 
       }, 
       Logout: logoutOnSessionExpires 
      } 
     }).ajaxStart(function() { scheduleSessionPrompt(); }); 
     scheduleSessionPrompt(); 
    }); 

    function scheduleSessionPrompt() 
    { 
     if (logoutTimer) clearTimeout(logoutTimer); 
     if (sessionTimer) clearTimeout(sessionTimer); 

     sessionTimer = setTimeout(sessionExpiring, sessionTimeout ); 
    } 

    function sessionExpiring() 
    { 
     logoutTimer = setTimeout(logoutOnSessionExpires, sessionDialogWait); 
     $('#sessionEndDialog').dialog('open'); 
    } 

    function logoutOnSessionExpires() 
    { 
     window.location.href = '<%= Url.Action("Logout", "Account") %>'; 
    }  

    </script> 
<% } %> 

<div id="sessionEndDialog" title="Session Expiring" style="display: none;"> 
    <p>Your session is about to expire. Click OK to renew your session or Logout to logout of the application.</p> 
</div> 
+0

क्या ग्लोबल.एक्सएक्स में सत्र_एंड का उपयोग किया जा सकता है? –

+0

मुझे नहीं लगता कि आप सत्र_इंड ईवेंट से ब्राउज़र को किसी दूसरे पृष्ठ पर रीडायरेक्ट कैसे करेंगे जब तक कि ब्राउज़र समय-समय पर यह देखने के लिए जांच नहीं कर रहा कि सत्र लाइव है या नहीं। दुर्भाग्यवश, ब्राउज़र होने से यह कृत्रिम रूप से सत्र को जीवंत रखेगा क्योंकि यह प्रत्येक क्वेरी पर अपडेट किया जाएगा। मैं इसे एक jQuery प्लगइन में बदलने पर काम कर रहा हूं। – tvanfosson

+0

अगर मैं गलत हूं तो मुझे सही करें लेकिन सत्र_एंड पृष्ठभूमि थ्रेड में चलता है और इस तरह उपयोगकर्ता के साथ संवाद नहीं कर सकता है। अपने काम tvanfosson से प्यार है, आपका दृष्टिकोण बहुत अच्छी तरह से काम करता है – CodeKiwi

6

मैं तुम्हें किसी तरह से उपयोगकर्ता के सत्यापन कर रहे हैं संभालने हूँ, लेकिन आप प्रपत्र प्रमाणीकरण ?:

ASP.Net MVC Framework - Using Forms Authentication

आप पहले से ही फार्म प्रमाणीकरण का उपयोग कर रहे हैं, तो आप की जरूरत का उपयोग कर रहे सुनिश्चित करें कि प्रमाणीकरण कुकी समाप्ति समय आपके सत्र समय समाप्ति से थोड़ा सा छोटा है।

+0

हां, मैं अपने आधार के रूप में डिफ़ॉल्ट एमवीसी प्रोजेक्ट का उपयोग कर रहा हूं। –

+0

यूयूके! मुझे नफरत है जब साइटें हर समय मुझे लॉग आउट करती हैं। इसे लागू करने से पहले ध्यान से सोचें या नहीं। आपकी साइट की प्रकृति पाठ्यक्रम का निर्णायक कारक होगा :) –

0

डेटा अभी भी पृष्ठ पर हो सकता है क्योंकि ब्राउज़र इसे कैशिंग कर रहा है।

इस में फेंकने की कोशिश करो और अगर डेटा अभी भी वहाँ के बाद सत्र मर चुका है है देखें:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
5

मैं एक पुराने ASP.net अनुप्रयोग के साथ कि एक ही समस्या थी। सत्र समाप्त हो जाता है लेकिन उपयोगकर्ता अभी भी प्रमाणीकृत है क्योंकि सत्र और प्रमाणीकरण कुकीज़ अलग-अलग हैं और जरूरी नहीं कि वे एक ही समय में समाप्त हो जाएं। फिर मैंने जो किया वह वैश्विक.एएसएक्स सत्र_स्टार्ट का उपयोग यह जांचने के लिए किया गया था कि उपयोगकर्ता प्रमाणीकृत है या उसे लॉग आउट करें।

protected void Session_Start(Object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect("~/SessionEnd.aspx"); 
     } 
    } 

यह उपयोगकर्ता को फिर से लॉगिन करने के लिए सत्र शुरू करने के लिए मजबूर करता है। आप डेटाबेस से सत्र जानकारी पुनर्प्राप्त करने के लिए इस ईवेंट का उपयोग भी कर सकते हैं, या शायद उसे किसी दूसरे पृष्ठ पर रीडायरेक्ट कर सकते हैं लेकिन उसके क्रेडेंशियल्स को वैध रख सकते हैं।

+0

सत्र टाइमआउट वेबसर्वर का एक फ़ंक्शन है? (आईआईएस 6) क्या इसे केवल नियंत्रण कक्ष में ही बदला जा सकता है? –

+0

मैंने इस कोड को आजमाया, यह मुझे लॉग आउट कर दिया लेकिन Response.Redirect मुझे मेरे पृष्ठ पर नहीं ले गया। –

+0

आप अपने web.config <सत्रस्टेट मोड = "इनप्रोक" टाइमआउट = "100" /> या सत्र का उपयोग करके प्रोग्रामेटिक रूप से सत्र समाप्ति बदल सकते हैं।टाइमआउट = एक्स; यदि आप साइन आउट करते हैं तो आप केवल लॉगिन पृष्ठ या ऐसे पृष्ठ पर जा सकते हैं जो प्रमाणीकरण द्वारा संरक्षित नहीं है। –