अद्यतन: नीचे दिया गया समाधान 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 सेकंड लेना चाहिए, और उपयोगकर्ता को सूचित नहीं होना चाहिए कि इनमें से कोई भी बिल्कुल हुआ!
यदि यह प्रासंगिक है, तो जारी रखने के लिए "हां" मारना उपयोगकर्ता को कार्रवाई में ले जाता है - जो कि जीईटी के रूप में मौजूद नहीं है, इसलिए उन्हें 404 मिलते हैं। – zimdanen
क्या आपको कोई साफ समाधान मिला? हमारे मामले में, हम इस बात पर विचार कर रहे हैं (यदि हम इस मुद्दे का पता लगा सकते हैं) पृष्ठ पर एक नया (छुपा) 'iframe' जोड़ना जो प्रासंगिक आंतरिक ऐप में एक नया पृष्ठ एक्सेस करता है। उस नए पेज को 'iframe' में लोड करना एडीएफएस सर्वर के खिलाफ एक पूर्ण निष्क्रिय प्रवाह को ट्रिगर करना चाहिए जो अंततः पुनः प्रमाणीकरण के बाद नया पृष्ठ लोड करेगा। उस बिंदु पर, नया पृष्ठ मौजूदा पृष्ठ को सूचित करेगा कि चक्र 'पोस्टमेसेज' के माध्यम से पूरा हो गया है, और उपयुक्त कुकीज़ फिर से उपलब्ध होनी चाहिए। –
@Damien_The_Unbeliever: हम समय के मुद्दों और अन्य प्राथमिकताओं के कारण इस में खोदना जारी नहीं रखा है। Iframe समाधान मुझे हैकी लगता है, लेकिन, अगर इस मुद्दे को ठीक करने का एकमात्र तरीका है, तो यह वही है। मुझे बताएँ यह आपके लिए कैसे काम करता है। – zimdanen