2013-09-05 7 views
6

फिर से प्रमाणीकृत करें मैंने Sliding Sessions for WIF 4.5 में वर्णित अनुसार मेरे रिलीइंग पार्टी एप्लिकेशन में स्लाइडिंग सत्र लागू किए हैं। यह तब तक बढ़िया काम करता है जब तक यह जाता है, लेकिन एक समस्या है जो ऐसा लगता है कि कोई भी इस बारे में बात नहीं करता है।डब्ल्यूआईएफ स्लाइडिंग सत्र

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

किसी भी घटना में, जो पूरी तरह से स्लाइडिंग सत्रों के पूरे बिंदु को हरा देता है।

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

मुझे लगभग निश्चित है कि यह संभव है, लेकिन मुझे बिल्कुल नहीं पता कि यह कैसे किया जाता है।

यहाँ Global.asax से मेरे कोड है:

private const int InactivityTimeout = 5; // minutes 

    void SessionAuthenticationModule_SessionSecurityTokenReceived 
     (object sender, SessionSecurityTokenReceivedEventArgs e) 
    { 
     var now = DateTime.UtcNow; 
     var validFrom = e.SessionToken.ValidFrom; 
     var validTo = e.SessionToken.ValidTo; 
     double halfSpan = (validTo - validFrom).TotalMinutes/2; 
     if (validFrom.AddMinutes(halfSpan) < now && now < validTo) 
     { 
      // add more time 
      var sam = sender as SessionAuthenticationModule; 

      e.SessionToken = sam.CreateSessionSecurityToken(
       e.SessionToken.ClaimsPrincipal, 
       e.SessionToken.Context, 
       now, 
       now.AddMinutes(InactivityTimeout), 
       e.SessionToken.IsPersistent); 
      e.ReissueCookie = true; 
     } 
     else 
     { 
      // re-authenticate with STS 
     } 
    } 

मेरे सवालों का:

  1. else खंड फिर से प्रमाणीकरण तर्क डाल करने के लिए उचित जगह है?
  2. यदि ऐसा है, तो कृपया एक उदाहरण प्रदान करें, 'क्योंकि मुझे कोई जानकारी नहीं है।
  3. यदि # 1 का उत्तर नहीं है, तो क्या मुझे एक अलग घटना की सदस्यता लेने की आवश्यकता है जो मुझे बताएगी "अरे, आपका सत्र सुरक्षा टोकन समाप्त हो गया है!"

उत्तर

2

मैं आपको एसटीएस और आरपी (एस) पर सत्र जीवनकाल सिंक करने की सलाह दूंगा।

आप सत्र जीवनकाल को एसटीएस पर 10 मिनट और आरपी पर 10 मिनट सेट कर सकते हैं और आरपी पर स्लाइडिंग सत्र दृष्टिकोण का उपयोग कर सकते हैं। 10 मिनट की निष्क्रियता के बाद दोनों सत्र समाप्त हो जाएंगे और उपयोगकर्ता को फिर से प्रमाणित करने की आवश्यकता होनी चाहिए।

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

"एसटीएस से संसाधन" का अर्थ एक अदृश्य आईफ्रेम में एक वेब पेज (वेब ​​फॉर्म/एमवीसी) लोड हो सकता है। महत्वपूर्ण बात यह है कि यह एक प्रबंधित हैंडलर है इसलिए अनुरोध ASP.NET द्वारा संभाला जाता है।

अपने प्रश्नों के लिए के रूप में, आप सत्र जीवन काल सिंक यदि ऐसा है तो वे एक साथ समय बाहर:

  1. नहीं, आप किसी और खंड में किसी भी कोड जोड़ने की जरूरत नहीं है। यदि टोकन समाप्त हो गया है, तो डब्ल्यूआईएफ एसटीएस पर रीडायरेक्ट करेगा।
  2. बस अन्य खंड को हटा दें।
  3. डब्ल्यूआईएफ इसे आपके लिए संभालने दें।

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

using System.IdentityModel.Services; //WIF 4.5 

var stsAddress = new Uri(FederatedAuthentication.FederationConfiguration.WsFederationConfiguration.Issuer); 
WSFederationAuthenticationModule.FederatedSignOut(stsAddress, null); //Optional replyUrl set to null 

आशा है कि मदद करता है!

+0

उत्तर के लिए धन्यवाद। मैं सत्र जीवनकाल को सिंक नहीं करना चाहता क्योंकि इससे उपयोगकर्ता को हर 10 मिनट में पुनः प्रमाणित करने के लिए मजबूर किया जाएगा। कल्पना करें कि अगर आप विजुअल स्टूडियो में काम कर रहे हैं तो आपको ऐसा करना होगा। मैं चाहता हूं कि यह मेरे विंडोज मशीन की तरह काम करे: मेरा सत्र तब तक वैध रहता है जब तक मैं कंप्यूटर का उपयोग कर रहा हूं। लेकिन अगर मैं 5 मिनट के लिए निष्क्रिय हूं, तो यह मेरे वर्कस्टेशन को लॉक करता है और मुझे पुनः प्रमाणीकरण करना होगा। संघीय साइनआउट काम कर सकता है, जब तक कि मैं उस पृष्ठ पर वापस लौटाया जा सकता जहां मैंने छोड़ा था। मैं इसे आज़मा दूंगा। –

+0

मुझे नहीं लगता कि उपयोगकर्ता को आरपी पर स्लाइडिंग सत्र लागू करने पर हर 10 मिनट में फिर से प्रमाणीकरण करना होगा। – klings

+1

यदि मैंने अनुशंसित एसटीएस पर सत्र जीवनकाल को 10 मिनट तक सेट किया है, तो एसटीएस टोकन 10 मिनट के बाद समाप्त हो जाएगा। आरपी एसकेएस टोकन की अनुमति से लंबे समय तक टोकन के जीवनकाल का विस्तार नहीं कर सकता है। जब तक मैंने आपके द्वारा लिखी कुछ गलत समझा नहीं? –

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