2012-06-08 35 views
10

फिर भी फॉर्म प्रमाणीकरण टिकट के साथ एक और समस्या जल्द ही समाप्त हो रही है। मुझे स्लाइडिंग समाप्ति सेट को सही पर उपयोग करने की आवश्यकता है। मैंने फ़ोरम पढ़े हैं और परिशुद्धता के नुकसान के साथ समस्या को समझ लिया है, कि टिकट केवल तभी अपडेट हो जाता है जब अनुरोध केवल समाप्ति समय के आधे के बाद किया जाता है।मैन्युअल रूप से फॉर्म प्रमाणीकरण टिकट नवीनीकरण:

समस्या

:

<authentication mode="Forms"> 
     <forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" /> 
    </authentication> 
    <sessionState timeout="20" /> 
    <authorization> 

उपयोगकर्ता केवल लॉग आउट और, Login.aspx पर पुनः निर्देशित केवल जब वहाँ 20 मिनट के अंतराल में किए गए कोई अनुरोध किया जाना चाहिए था: मेरी webconfig में मैं इस प्रकार की है। समस्या यह है कि उपयोगकर्ता अनुरोध कर रहे हैं, और फिर भी लॉगिन पृष्ठ पर फेंक दिया जाता है। ऐसा न हो कि। मैंने जो करने का सोचा था, वह प्रत्येक अनुरोध के लिए मैन्युअल रूप से SqlAuthCookie को रीसेट करना था।

नीचे मेरा कोड है। इसे संदर्भ पर कहा जाता है। AcquireRequestState।

void context_AcquireRequestState(object sender, EventArgs e) 
    { 
     HttpContext ctx = HttpContext.Current; 
     ResetAuthCookie(ctx); 
    } 

      private void ResetAuthCookie(HttpContext ctx) 
    { 
     HttpCookie authCookie = ctx.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie == null) 
      return; 

     FormsAuthenticationTicket ticketOld = FormsAuthentication.Decrypt(authCookie.Value); 
     if (ticketOld == null) 
      return; 

     if (ticketOld.Expired) 
      return; 

     FormsAuthenticationTicket ticketNew = null; 
     if (FormsAuthentication.SlidingExpiration) 
      ticketNew = FormsAuthentication.RenewTicketIfOld(ticketOld); 

     if (ticketNew != ticketOld) 
      StoreNewCookie(ticketNew, authCookie, ctx); 
    } 

    private void StoreNewCookie(FormsAuthenticationTicket ticketNew, HttpCookie authCookie, HttpContext ctx) 
    { 
     string hash = FormsAuthentication.Encrypt(ticketNew); 
     if (ticketNew.IsPersistent) 
      authCookie.Expires = ticketNew.Expiration; 

     authCookie.Value = hash; 
     authCookie.HttpOnly = true; 

     ctx.Response.Cookies.Add(authCookie); 
    } 

मेरे प्रश्न हैं:

  1. यह प्रत्येक अनुरोध पर कुकी को रीसेट गलत या एक स्वीकार्य समाधान है?
  2. यह अभी भी क्यों काम नहीं करता है? ऐसा लगता है कि नया टिकट कभी नवीनीकृत नहीं होता है।
  3. क्या अन्य कारण संभव हैं, इस तथ्य के लिए कि उपयोगकर्ताओं के पास उनके फॉर्म प्रमाणीकरण बहुत जल्द समाप्त हो गए हैं, मुझे जांच करनी चाहिए?

धन्यवाद, सादर,

+0

ढांचे और आईआईएस का आप किस संस्करण का उपयोग कर रहे हैं? प्रोजेक्ट के लिए –

+0

लक्ष्य ढांचा 4.0 है। आईआईएस संस्करण 7 है, लेकिन मैं विजुअल स्टूडियो 2010 में अंतर्निहित वेबसर्वर –

+0

पर परीक्षण कर रहा हूं, मुझे लगता है कि आपको फॉर्म टैग में डोमेन विशेषता देना चाहिए। प्रत्येक अनुरोध पर नवीनीकरण कुकी लिखने की कोई आवश्यकता नहीं –

उत्तर

14

एक रूपों प्रमाणीकरण कुकी केवल खुद नवीनिकृत आधे के बाद यह सीमा समाप्ति समय बीत चुका है है।

माइक्रोसॉफ्ट से

:

से पहले सीमा समाप्ति समय के आधे से गुजरता है वेब पेज एक्सेस किया जाता है, टिकट समाप्ति समय रीसेट नहीं होंगे। उदाहरण के लिए, यदि कोई वेब पृष्ठ 5:04 00:00:00 अपराह्न पर फिर से एक्सेस किया गया है, तो कुकीज़ और टिकट टाइमआउट अवधि रीसेट नहीं की जाएगी।

समझौता प्रदर्शन रोकने के लिए, और उन है कि कुकी चेतावनी के लिए एकाधिक ब्राउज़र चेतावनी से बचने के लिए चालू, कुकी अद्यतन किया जाता है जब निर्धारित समय से आधे से ज्यादा बीत गया है।

यह आपकी समस्या हो सकती है। यदि आपके ग्राहक 9 मिनट के निशान पर आपकी साइट तक पहुंचते हैं और 10 मिनट के लिए इसे फिर से एक्सेस नहीं करते हैं तो उन्हें समय समाप्त कर दिया जाएगा। यह तब भी होता है जब आपका सत्र टाइमआउट 20 मिनट तक सेट हो।

मैन्युअल रूप से आपके टिकट को नवीनीकृत करना जैसे आप कर रहे हैं आवश्यक नहीं है। आपको सिर्फ समाप्ति की समाप्ति की आवश्यकता है। यदि 'आधा विशिष्ट समय' नियम आपके लिए काम नहीं करता है तो आपको अन्य समाधानों को देखना होगा।

+1

हम इसे एक ही समस्या से भाग गया। मैं इस लेख से पहले एमएस लेख में भाग गया। जानकारी का बड़ा हिस्सा यहां है। https://support.microsoft.com/en-us/kb/910443 – Shrini

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