2011-01-31 8 views
9

मैं उपयोगकर्ताओं को लॉग इन करने के लिए उपयोगकर्ताओं को लॉग इन करने के लिए एएसपी.NET फॉर्म प्रमाणीकरण का उपयोग कर रहा हूं।मुझे एएसपी.नेट फॉर्म प्रमाणीकरण में कार्यक्षमता याद रखें

कार्यक्षमता का एक हिस्सा "मुझे याद रखें" चेकबॉक्स है जो उपयोगकर्ता को एक महीने के लिए याद करता है यदि वे इसे चेक करते हैं।

उपयोगकर्ता प्रवेश करने में इस प्रकार के लिए कोड:

<authentication mode="Forms"> 
    <forms loginUrl="Home.aspx" defaultUrl="~/" slidingExpiration="true" timeout="43200" /> 
</authentication> 

इस उपयोगकर्ता ठीक लॉग लेकिन उनमें लॉग आउट के बाद:

public static void Login(HttpResponse response, string username, 
    bool rememberMeChecked) 
{ 
    FormsAuthentication.Initialize(); 
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, DateTime.Now, 
    DateTime.Now.AddMinutes(30), rememberMeChecked, 
    FormsAuthentication.FormsCookiePath); 
    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(tkt)); 
    ck.Path = FormsAuthentication.FormsCookiePath; 

    if (rememberMe) 
    ck.Expires = DateTime.Now.AddMonths(1); 

    response.Cookies.Add(ck); 
} 

web.config में प्रासंगिक अनुभाग यह है आधे घंटे यदि वे साइट का उपयोग नहीं करते हैं, हालांकि इसकी दृढ़ता संपत्ति (याद रखें Ichechecked) सत्य पर सेट है और यदि यह सत्य है, तो कुकी एक महीने के बाद समाप्त हो जाएगी। क्या मैं यहाँ कुछ याद कर रहा हूँ?

अग्रिम धन्यवाद, एफ

+1

मुझे यकीन है कि अगर यह इस उदाहरण में एक अंतर बिल्कुल बनाना होगा नहीं कर रहा हूँ, फिर भी, क्या 'FormsAuthentication.RedirectFromLoginPage (उपयोगकर्ता नाम, rememberMe)' उपयोग करने के साथ गलत क्या है? क्या टिकट मैन्युअल रूप से बनाने की आवश्यकता है? यदि आप कॉन्फ़िगरेशन में टाइमआउट निर्दिष्ट करते हैं तो आपको कोड, AFAIK में इसे हस्तशिल्प करने की आवश्यकता नहीं है। साथ ही, 'याद रखें' कहां सेट किया जा रहा है? –

उत्तर

0

यह मेरे लिए लग रहा है कि आप "rememberMe" के बजाय चर आप "rememberMeChecked" कहा जाता है पारित जाँच कर रहे हैं।

1

अपने web.config में

इसके अलावा रूपों टैग की Name विशेषता सेट करने का प्रयास Firecookie फिर मुद्दों

बस अपने कोड के माध्यम से पढ़ने के इन प्रकार डिबगिंग में भयानक है, आप भी निर्दिष्ट किया है DateTime.Now.AddMinutes(30) आपके टिकट कन्स्ट्रक्टर में ... यह जांचना है कि

+0

'नाम' लिंक टूटा हुआ है। –

+1

@TravisJ अपडेट किया गया :) – davidsleeps

0

आपने FormsAuthenticationTicket के लिए कन्स्ट्रक्टर में DateTime.Now.AddMinutes(30) निर्दिष्ट किया है। यह लॉगिन के लिए समाप्ति की सेटिंग है।

6

ऐसा लगता है कि अपने प्रमाणीकरण टिकट अभी भी आधे घंटे के बाद समाप्त करने के लिए कॉन्फ़िगर किया गया है, भले ही कुकी ही 30 दिन में समाप्त। आप शायद टिकट के जीवनकाल भी विस्तार करने के लिए है:

public static void Login(HttpResponse response, string username, 
    bool rememberMeChecked) 
{ 
    DateTime expiration = DateTime.Now.AddMinutes(30); 
    if (rememberMe) { 
     expiration = DateTime.Now.AddMonths(1); 
    } 

    FormsAuthentication.Initialize(); 
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, 
     DateTime.Now, expiration, rememberMeChecked, 
     FormsAuthentication.FormsCookiePath); 

    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(tkt)); 
    ck.Path = FormsAuthentication.FormsCookiePath; 
    response.Cookies.Add(ck); 
} 
-1

मुझे एहसास हुआ कि प्रमाणीकरण टिकट, नवीनीकृत होने के लिए केवल पढ़ने के लिए नहीं किया था। मेरी Application_BeginRequest विधि अब इस तरह दिखती है:

if (!Request.IsAuthenticated) 
    { 
    HttpCookie ck = Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (ck != null) 
    { 
     FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(ck.Value); 
     UserManagementUtils.RenewFormsAuthenticationTicket(Response, oldTicket); 
    } 
    } 

ऐसा लगता है कि इसकी देखभाल की गई है।

+0

इसे ढांचे द्वारा ख्याल रखा जाना चाहिए। मुझे लगता है कि ऊपर दिए गए उत्तर में उल्लिखित समस्या यह है कि आपने टिकट की समाप्ति केवल कुकी को निर्धारित नहीं की है। – Justin