2013-03-27 13 views
7

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

This page is accessing information that is not under its control. This poses a security risk. Do you want to continue?

यह पेज की तरह लगता है की कोशिश कर रहा है: हालांकि, अगर एक उपयोगकर्ता एक घंटे से अधिक के लिए एक पृष्ठ खुला छोड़ देता है तो (अन्य की तुलना में अन्य पृष्ठ पर नेविगेट) उस पृष्ठ पर कुछ करने की कोशिश करता है, वे कोई त्रुटि मिलती है उस अनुरोध को ADFS सर्वर पर रीडायरेक्ट करें और ब्राउज़र द्वारा इसे रोका जा रहा है।

मेरा प्रश्न इस प्रकार है: मैं इस स्थिति को कैसे पकड़ूं और उपयोगकर्ता को एडीएफएस सर्वर को पुनः प्रमाणीकरण के लिए कैसे प्राप्त करूं?

मुझे इसके बारे में Google पर कुछ भी भाग्य नहीं मिला है।

+0

यदि यह प्रासंगिक है, तो जारी रखने के लिए "हां" मारना उपयोगकर्ता को कार्रवाई में ले जाता है - जो कि जीईटी के रूप में मौजूद नहीं है, इसलिए उन्हें 404 मिलते हैं। – zimdanen

+0

क्या आपको कोई साफ समाधान मिला? हमारे मामले में, हम इस बात पर विचार कर रहे हैं (यदि हम इस मुद्दे का पता लगा सकते हैं) पृष्ठ पर एक नया (छुपा) 'iframe' जोड़ना जो प्रासंगिक आंतरिक ऐप में एक नया पृष्ठ एक्सेस करता है। उस नए पेज को 'iframe' में लोड करना एडीएफएस सर्वर के खिलाफ एक पूर्ण निष्क्रिय प्रवाह को ट्रिगर करना चाहिए जो अंततः पुनः प्रमाणीकरण के बाद नया पृष्ठ लोड करेगा। उस बिंदु पर, नया पृष्ठ मौजूदा पृष्ठ को सूचित करेगा कि चक्र 'पोस्टमेसेज' के माध्यम से पूरा हो गया है, और उपयुक्त कुकीज़ फिर से उपलब्ध होनी चाहिए। –

+1

@Damien_The_Unbeliever: हम समय के मुद्दों और अन्य प्राथमिकताओं के कारण इस में खोदना जारी नहीं रखा है। Iframe समाधान मुझे हैकी लगता है, लेकिन, अगर इस मुद्दे को ठीक करने का एकमात्र तरीका है, तो यह वही है। मुझे बताएँ यह आपके लिए कैसे काम करता है। – zimdanen

उत्तर

1

आप global.asax में मैन्युअल रूप से सुरक्षा टोकन का निरीक्षण और पुन: जारी कर सकते हैं, और स्लाइडिंग सत्र बनाने के लिए इसका उपयोग कर सकते हैं। स्लाइडिंग सत्रों के साथ, आप फिर से प्रमाणीकरण स्थगित करना चुन सकते हैं जब तक कि ऐसा करने के लिए "सुरक्षित" न हो (जब एडीएफएस रीडायरेक्ट के कारण डेटा अब खो नहीं जाएगा)।

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

protected void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
{ 
    var now = DateTime.UtcNow; 
    SessionSecurityToken token = e.SessionToken; 
    var httpContext = new HttpContextWrapper(this.Context); 

    if (now > token.ValidTo 
     && (httpContext.Request.IsAjaxRequest() || httpContext.Request.HttpMethod == "POST")) 
    { 
     var sessionAuthModule = (SessionAuthenticationModule)sender; 
     e.SessionToken = sessionAuthModule.CreateSessionSecurityToken(token.ClaimsPrincipal, 
                    token.Context, 
                    now, 
                    now.AddMinutes(2), 
                    token.IsPersistent); 
     e.ReissueCookie = true; 
    } 
} 

एडीएफएस सत्र अगले जीईटी अनुरोध तक पुन: प्रमाणीकरण स्थगित करना जारी रखेगा। फिर रीडायरेक्ट अंत में होगा, और उपयोगकर्ता को सामान्य जीवनकाल का उचित टोकन जारी किया जाएगा।

+0

मैं में हूं प्रारंभिक प्रश्न का एक ही परिदृश्य, और मैं इस समाधान की कोशिश कर रहा हूं। मुझे कौन सा nuget पैकेज स्थापित करना है? इस हैंडलर को –

+0

कभी नहीं निकाल दिया गया है यह माइक्रोसॉफ्ट टोकन सत्यापन एक्सटेंशन पैकेज (System.IdentityModel.Tokens.ValidatingIssuerNameRegistry) का उपयोग करता है। – friggle

3

अद्यतन: नीचे दिया गया समाधान iframes पर निर्भर करता है। एडीएफएस 3.0 में X-Frame-Options को DENY में डिफॉल्ट किया गया है, जिसमें सेटिंग बदलने के लिए कोई विकल्प नहीं है। तो यह समाधान केवल ADFS 2.1 & पर काम करेगा।

अपने global.asax.cs में, आप किसी के मध्य AJAX के 302s को पकड़ने और उन्हें एक 401 अनधिकृत में बदलने के लिए चाहते करने जा रहे हैं। यह कॉल को आगे बढ़ने से रोक देगा (और उस संदेश को पॉपिंग करेगा), और हमें $ (दस्तावेज़) .ajaxError() पर भेज देगा।

protected void Application_EndRequest() 
    { 
     var context = new HttpContextWrapper(this.Context); 
     if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) 
     { 
      context.Response.Clear(); 
      context.Response.StatusCode = 401; 
     } 
    } 

फिर, वहां, आपके बाकी त्रुटि प्रबंधन पर आगे बढ़ने से पहले किसी भी 401 को रोक दें। मैंने उपयोगकर्ताओं को एक संदेश दिखाना चुना। आप यहां अगला कदम कर सकते हैं, लेकिन पठनीयता के लिए, मैं AJAXSettings ऑब्जेक्ट को किसी अन्य फ़ंक्शन पर भेज रहा हूं। वापस लौटें ताकि यह आपके बाकी त्रुटि प्रबंधन में आगे नहीं बढ़ेगा।

यदि आप डबलशेक करना चाहते हैं कि यह ADFS है, event.target.referrer के पास प्रयास किए गए रीडायरेक्ट का URL होगा।

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    if (xhr.status == 401) { 
     alert("Your session has timed out. Click OK to reauthorize and extend your session."); 

     TriggerReauthenticationRefresher(ajaxSettings); 
     return true; 
    } 
…the rest of the error handling code…    
}); 

मैं 'refresherBox' का एक आईडी के साथ सिर्फ इस स्थिति के लिए मेरे पेज में एक खाली div है,, लेकिन आप अपने डोम में किसी भी तत्व पर कर सकते हैं। एक आईफ्रेम को एक साथ रखें जो आपके डोमेन में कुछ डमी पेज पर जाता है। मेरे मामले में, ADFSRefresher.cshtml की सामग्री को सिर्फ

<div><input type="hidden" value="@DateTime.Now.ToString()" /></div> 

इसके बजाय वैश्विक चर का उपयोग कर के, मैं ajaxSettings .data का उपयोग कर() भंडारण कर रहा हूँ कर रहे हैं। हमें यह भी ट्रैक रखने की आवश्यकता है कि आईफ्रेम पुनः लोड कितनी बार है, इसलिए हम लोडकाउंट भी संग्रहीत कर रहे हैं। डीओएम में आईफ्रेम डालें, और यह बंद हो जाएगा।

function TriggerReauthenticationRefresher(ajaxSettings) { 
    var refreshframe = '<iframe src="@Url.Action("ADFSRefresher", "Debug")" style="display:none" onload="TrackFrameReloads()" />'; 

    $('#refresherBox').data('loadcount', 0); 
    $('#refresherBox').data('originalRequestSettings', ajaxSettings); 

    $('#refresherBox').html(refreshframe); 
} 

ट्रैकफ्रेम रीलोड लोड हर बार आईफ्रेम लोड होने पर आग लग जाएगा। चूंकि हम जानते हैं कि एक आगामी एडीएफएस रीडायरेक्ट है, यह दो बार आग लग जाएगा। पहली बार रीडायरेक्ट होगा, और दूसरी बार इसके src url होगा। तो पहली बार यह आग लगती है, हम सिर्फ लोडकाउंट बढ़ाते हैं।

दूसरी बार यह आग लगती है, हम जानते हैं कि हमें सफलतापूर्वक पुनः प्रमाणित किया गया है। AJAX सेटिंग्स को पुनर्प्राप्त करें, संग्रहीत डेटा साफ़ करें, और फिर आप AJAX कॉल भेजने के लिए अपनी मूल सेटिंग्स का पुन: उपयोग कर सकते हैं! यह अनदेखा हो जाएगा, और इसकी मूल सफलता & पूर्ण कार्यों को चलाएगा।

function TrackFrameReloads() { 
    var i = $('#refresherBox').data('loadcount'); 
    if (i == 1) { 
     alert('Your session has been extended.'); 

     var ajaxSettings = $('#refresherBox').data('originalRequestSettings'); 

     $('#refresherBox').removeData(); 

     $.ajax(ajaxSettings); 

    } else { 
     $('#refresherBox').data("loadcount", 1); 
    } 
} 

ध्यान रखें कि यदि आपने उन्हें परिभाषित किया है, तो त्रुटि और पूर्ण कार्य पहले से ही निकाल दिए जाएंगे।

यदि आप चाहें तो आप दो चेतावनी संदेशों को उपयोगकर्ताओं को छोड़ सकते हैं।आपके एडीएफएस सेटअप के आधार पर, इसे केवल 1 सेकंड लेना चाहिए, और उपयोगकर्ता को सूचित नहीं होना चाहिए कि इनमें से कोई भी बिल्कुल हुआ!

+0

यह काम करता है लेकिन मुझे लगता है कि इस सत्र में पहले से जानना बेहतर होगा कि सत्र समाप्त हो गया है और आपके सभी 302 प्रतिक्रियाओं को कैनबिललाइज करने के बजाय कुछ करना है। – BigOmega

+0

एडीएफएस मुझे iFrame में लोड करने की अनुमति नहीं देगा: फ्रेम में प्रदर्शित करने से इंकार कर दिया क्योंकि यह 'X-Frame-Options' को 'DENY' पर सेट करता है। इस के आसपास कोई रास्ता? – severin

+1

क्या आप जानते हैं कि एडीएफएस का कौन सा संस्करण है? स्पष्ट रूप से एडीएफएस 3 डेनी को सेटिंग को डिफॉल्ट करता है, और इसे बदलने का कोई तरीका नहीं देता है। मैं यह नोट करने के लिए अपना उत्तर अपडेट करूंगा कि यह समाधान केवल एडीएफएस 2 और नीचे के साथ काम करता है। मैं वास्तव में पोस्ट समाधान का उपयोग करने से दूर चले गए हैं, और इसके बजाय स्लाइडिंग सत्रों का उपयोग करना शुरू कर दिया है। यह पोस्ट इस बारे में सीखने के लिए बेहद सहायक था: http://www.cloudidentity.com/blog/2010/06/16/warning-sliding- सत्र-are-closer-than-they-appear/ – friggle

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