2009-09-24 15 views
56

मेरी asp.net वेबसाइट में मैं निम्न कॉन्फ़िगरेशन के साथ asp.net प्रपत्र प्रमाणीकरण का उपयोग कर रहाफार्म प्रमाणीकरण समय समाप्त बनाम सत्र का समय समाप्त

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/Common/Login.aspx" 
      defaultUrl="~/Pages/index.aspx" 
      protection="All" 
      timeout="30" 
      name="MyAuthCookie" 
      path="/" 
      requireSSL="false" 
      cookieless="UseDeviceProfile" 
      enableCrossAppRedirects="false" > 
    </forms> 
</authentication> 

मैं निम्नलिखित है सवाल

  1. क्या के लिए मूल्य का समय-समाप्त किया जाना चाहिए सत्र क्योंकि मैं फ़ॉर्म प्रमाणीकरण के अंदर स्लाइडिंग समाप्ति का उपयोग कर रहा हूं क्योंकि कौन सा सत्र फॉर्म प्रमाणीकरण से पहले समाप्त हो जाएगा। मैं इसकी रक्षा कैसे कर सकता हूं?

  2. फॉर्म प्रमाणीकरण लॉग आउट के बाद मैं logout.aspx पर पृष्ठ को रीडायरेक्ट करना चाहता हूं लेकिन यह स्वचालित रूप से loginpage.aspx पर मुझे रीडायरेक्ट कर रहा है। यह कैसे संभव है?

उत्तर

47
  1. सुरक्षित पक्ष पर होना करने के लिए: टाइम आउट (सत्र) < = टाइमआउट (FormsAuthentication) * 2
  2. आप loginUrl विशेषता में निर्दिष्ट के अलावा अन्य पेज प्रमाणीकरण समय समाप्ति के बाद आप को संभाल करने की जरूरत है दिखाना चाहते हैं यह मैन्युअल रूप से एएसपी.नेट के रूप में ऐसा करने का एक तरीका प्रदान नहीं करता है।

# 2 को प्राप्त करने के आप मैन्युअल रूप से कुकी और समाप्ति के लिए अपने AuthenticationTicket की जाँच करें और यदि वे समाप्त हो गए हैं अपने कस्टम पृष्ठ पर रीडायरेक्ट कर सकते हैं।
आप इन घटनाओं में से किसी एक में कर सकते हैं: AcquireRequestState, AuthenticateRequest

// Retrieve AuthenticationCookie 
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
if (cookie == null) return; 
FormsAuthenticationTicket ticket = null; 
try { 
    ticket = FormsAuthentication.Decrypt(cookie.Value); 
} catch (Exception decryptError) { 
    // Handle properly 
} 
if (ticket == null) return; // Not authorised 
if (ticket.Expiration > DateTime.Now) { 
    Response.Redirect("SessionExpiredPage.aspx"); // Or do other stuff here 
} 
+2

धन्यवाद दिमित्री, मेरा दूसरा प्रश्न: जैसा कि

के अंदर लिखा गया है कि डिफ़ॉल्ट पृष्ठ "index.aspx" है और लॉगिन "login.aspx" है। मेरे डैशबोर्ड पेज पर लॉगिन करने के बाद जब मैं 30 मिनट (टाइमआउट) के लिए आदर्श रहता हूं और उसके बाद मैं किसी भी लिंक पर क्लिक करता हूं तो मैं स्वचालित रूप से निम्नलिखित यूआरएल http: // localhost: /virtualdir/Pages/Login.aspx के साथ लॉगिन पेज पर रीडायरेक्ट करूँगा? ReturnUrl =% 2fvirtualdir% 2fPages% 2fDashBoard.aspx लेकिन यहां मैं लॉगआउट पेज पर पृष्ठ को रीडायरेक्ट करना चाहता हूं, जहां मैं कुछ लॉगआउट जानकारी कह सकता हूं –

+0

उत्तर को अपडेट किया गया। –

+0

क्या आप मुझे उदाहरण दिखा सकते हैं क्योंकि मेरे मामले में मैं फॉर्मआउट प्रमाणीकरण टाइमआउट = 2 मिनट सेट करता हूं, जबकि सत्र टाइमआउट = 6 मिनट और 3 मिनट के बाद जब मैं लिंक पर क्लिक करता हूं तो यह "AcquireRequestState" पर कहीं भी डीबग नहीं करता है कृपया सहायता कीजिए? –

24

साइटों एक सत्र निर्भरता है के लिए, आप बस Global.asax में सत्र शुरू होने से घटना के साथ एक बासी प्रमाणीकरण से प्रस्थान कर सकते: घटना में

नमूना कोड की तरह लग सकता है

void Session_Start(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.IsAuthenticated) 
    { 

    //old authentication, kill it 
    FormsAuthentication.SignOut(); 
    //or use Response.Redirect to go to a different page 
    FormsAuthentication.RedirectToLoginPage("Session=Expired"); 
    HttpContext.Current.Response.End(); 
    } 

} 

इससे यह नया सत्र = नया प्रमाणीकरण, अवधि बनाता है।

+1

यह बलवान लगता है, लेकिन हमारे लिए एक अच्छा विकल्प था जहां इस समय सत्र में सत्र होना आवश्यक है। –

+3

मुझे यकीन नहीं है कि मैं इसे बलपूर्वक कहूंगा। यह बस सत्र प्रमाणीकरण राज्यों को एक साथ शादी करता है। निश्चित रूप से, प्रमाणीकरण टोकन दिए गए सत्र को पुनर्स्थापित करना एक और मजबूत विकल्प होगा। लेकिन यदि सत्र बहाली एक बाद विचार (यानी पूरे स्थान पर फैल गया) था, तो सबसे आसान समाधान उपयोगकर्ता को ज्ञात पथ (लॉग इन) पर वापस लेना है। –

+0

सच है, यह वह मार्ग है जिसे हमने तब तक लिया है जब तक कि हम स्वयं को फ्लाई पर सत्र बनाने के लिए तैयार नहीं कर सकते। –

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