2012-01-09 35 views
11

से पहले मूल प्रमाणीकरण को ट्रिगर करना मेरे पास एक परिदृश्य है जहां मुझे "प्रपत्र प्रमाणीकरण" का उपयोग करके AJAX अनुरोधों के प्रमाणीकरण को संभालना है। मेरी पिछली स्टैक ओवरफ्लो पोस्ट से कुछ खोज और सहायता के आधार पर, मैंने here पर वर्णित विधि का उपयोग करने का निर्णय लिया था।प्रतिक्रिया कोड 401 jquery AJAX त्रुटि हैंडलर

विचार अनधिकृत अनुरोधों के लिए 401 प्रतिक्रिया वापस भेजना है, और उसके बाद AJAX त्रुटि हैंडलर में इसे संभालना है। तो मेरे पास मेरे एएसपीनेट एमवीसी 3 लेआउट पेज में एक एजेक्स त्रुटि हैंडलर है जो ब्राउज़र को लॉगिन पृष्ठ पर रीडायरेक्ट करता है जब इसे अनधिकृत AJAX अनुरोधों पर 401 प्रतिक्रिया प्राप्त होती है। AJAX त्रुटि हैंडलर यहाँ है।

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    if (jqXHR.status == "401") { 
     window.location.replace(loginUrl); 
    } 
    .... 
}); 

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

तो, ब्राउज़र AJAX त्रुटि हैंडलर चलाने से पहले प्रमाणीकरण पॉपअप क्यों दिखाता है?

संपादित करें: होस्टिंग सर्वर चल रहा है IIS 6.

+0

सावधान "यहाँ" ऊपर इस सवाल का पाठ में लिंक का अनुसरण हो ... यह एक ट्रोजन संक्रमण की रिपोर्ट। – hal9000

उत्तर

0

प्रतिक्रिया से WWW-प्रमाणित हैडर दूर करने की कोशिश।

+0

मैंने प्रतिक्रिया का उपयोग करके प्रतिक्रिया से "डब्ल्यूडब्ल्यूडब्लू-प्रमाणीकरण" हेडर को हटाने का प्रयास किया। हेडर। IHttpModule के "EndRequest" ईवेंट हैंडलर में हटाएं ("WWW-प्रमाणीकरण"), लेकिन कोड फेंकता है [PlatformNotSupportedException: इस ऑपरेशन को आईआईएस की आवश्यकता है एकीकृत पाइपलाइन मोड।]। तो मुझे संदेह है कि क्या हम प्रतिक्रिया से हेडर हटा सकते हैं। – Jatin

+1

आप प्रतिक्रिया का उपयोग कर सकते हैं। केवल आईआईएस 7 एकीकृत पाइपलाइन मोड में हेडर विधियों का उपयोग करें। प्रतिक्रिया का उपयोग करें। क्लीयरहेडर() और प्रतिक्रिया। आईआईएस 6 – ladoch

0

एकीकृत मोड में आईआईएस 6? मुझे विश्वास नहीं है कि ऐसी कोई चीज नहीं है, जब तक कि आप एकीकृत प्रमाणीकरण के बारे में बात नहीं कर रहे हों।

मेरा अनुमान है कि आप एक गैर-एएसपीएक्स एक्सटेंशन का उपयोग कर रहे हैं, इसलिए आईआईएस 6 पर इसका मतलब है कि यह .NET प्रक्रिया को भी मार नहीं रहा है। इसलिए, आईआईएस इसका अपना 401 त्रुटि प्रतिक्रिया पृष्ठ उपयोग कर रहा है।

संभावना है कि समाधान सभी अनुरोधों को .NET प्रक्रिया द्वारा संभालने के लिए मजबूर करना है।

आपके होस्ट को आईआईएस गुणों> कॉन्फ़िगरेशन> वाइल्डकार्ड मैपिंग्स में जाना होगा - और सब कुछ .NET प्रक्रिया में मैप करना होगा।

+0

स्कॉटई में ऐपेंड हैडर() विधियां, गलत जानकारी के बारे में खेद है, वास्तव में आईआईएस 6 में एकीकृत पाइपलाइन मोड नहीं है। वैसे भी, आपके अनुमान के संबंध में, मेरे पास IHttpModule कार्यान्वयन है, लेकिन यह ऐसा करने जा रहा है जो इसे करने के लिए किया जाता है, यानी, अनधिकृत AJAX अनुरोधों के लिए 401 प्रतिक्रिया लौटा रहा है। अनुरोधों को संभालने के लिए कोई अन्य गैर-एएसपीएक्स एक्सटेंशन नहीं है, इसलिए मुझे लगता है कि अनुरोध .NET प्रक्रिया द्वारा संभाला जा रहा है। आप IHttpModule कार्यान्वयन को ढूंढ सकते हैं जिसका उपयोग मैं अपने प्रश्न में दिए गए लिंक में कर रहा हूं। जवाब के लिए धन्यवाद। – Jatin

+0

नहीं, आईआईएस 6 में, डिफ़ॉल्ट रूप से .net प्रक्रिया विस्तारहीन यूआरएल को संभाल नहीं पाती है। इसलिए, अनुरोध आपके httpmodule को भी मार नहीं रहा है। यदि .NET सभी अनुरोधों को संभालता है, तो आपको ठीक होना चाहिए। – ScottE

+0

प्रमाणीकरण गैर-AJAX अनुरोधों के लिए ठीक काम करता है। मैं फॉर्म प्रमाणीकरण का उपयोग कर रहा हूं और यदि कोई अनधिकृत (गैर-AJAX) अनुरोध है, तो मुझे लॉग इन पेज पर सही तरीके से रीडायरेक्ट किया गया है। लॉगिन के बाद, मैं सभी एएसपीएनटी एमवीसी नियंत्रक की क्रिया विधियों तक पहुंच का उपयोग करने में सक्षम हूं। समस्या केवल अनधिकृत AJAX-अनुरोधों के लिए होती है, जहां मैं अपने मॉड्यूल से 401 प्रतिक्रिया भेज रहा हूं।दुर्भाग्यवश, आईआईएस 6 "नेगोशिएट" और "एनटीएलएम" के मूल्य के साथ दो शीर्षलेख "डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण" जोड़ रहा है, जो ब्राउज़र को प्रमाणीकरण पॉपअप को ट्रिगर करने का कारण बन रहा है। – Jatin

0

.net 401 त्रुटियों को पकड़ नहीं पाएगा। मैंने आईआईएस त्रुटि पृष्ठ को डिफ़ॉल्ट 401 पेज से अपने स्थिर 401 पेज पर सेट करना था। उस पृष्ठ से मैंने किसी अन्य हैंडलर पर रीडायरेक्ट करने के लिए जावास्क्रिप्ट का उपयोग किया था।

1

यह एक आसान सवाल के साथ एक आम सवाल है। 401 को .NET प्रमाणीकरण मॉड्यूल द्वारा लॉगिन पेज पर 302 में परिवर्तित किया गया है। ब्राउज़र 401 केवल 302 को नहीं देखता है।

बेशक यह अजाक्स कॉल के साथ अच्छी तरह से खेल नहीं रहा है।

सबसे अच्छा समाधान मैंने कोशिश की और मैं वर्तमान में उपयोग कर रहा हूं जिसमें एक नई विशेषता लिखना शामिल है जो 401 को पकड़ रहा है और इसे ट्रैनफॉर्म करता है ... 40 9 जो jquery AJAX हैंडलर द्वारा पकड़ा जाता है।

यह एक सशुल्क उत्पाद का हिस्सा है इसलिए मैं कोई कोड नहीं दे सकता।

+0

मैंने पहले से ही 401 रूपांतरण को दबाने के लिए 302 पर संभाला है। लेकिन अंत में मैं 401 लौट रहा था, और यह ब्राउज़र में आवश्यक पॉपअप प्रमाणीकरण को ट्रिगर कर रहा है। आज, मैंने एक कस्टम त्रुटि कोड लौटने की कोशिश की, 401 के बजाय 601 कहें और फिर इसे jquery AJAX त्रुटि हैंडलर में संभालें। यह मेरे स्टेजिंग सर्वर पर काम करता प्रतीत होता है, लेकिन क्या इस दृष्टिकोण में कोई समस्या हो सकती है? – Jatin

+1

हां, इसके बजाय 40 9 का उपयोग करें यह सुरक्षित है। 4xx प्रमाणीकरण त्रुटियां (सामान्यीकृत) हैं। 6xx सामान्य नहीं है। "स्टेटस कोड का 4xx वर्ग उन मामलों के लिए है, जिनमें क्लाइंट ने गलती की है।" http://en.wikipedia.org/wiki/List_of_HTTP_status_codes देखें। मैं 40 9 का उपयोग करता हूं क्योंकि मैं एक त्रुटि कोड का उपयोग करना पसंद करता हूं जो मौजूद है क्योंकि गैर मौजूदा http रिटर्न कोड के लिए कुछ ब्राउज़रों में कोई समर्थन नहीं हो सकता है। मेरे परीक्षण से पता चलता है कि 40 9 आईई, क्रोम, एफएफ और सफारी ब्राउज़र में अच्छी तरह से समर्थित है, और कोई विशेष ब्राउज़र सुविधा (302 करता है) ट्रिगर नहीं करता है। – Softlion

-1

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

विचार अप्रमाणित अनुरोधों के लिए एक 401 प्रतिक्रिया वापस भेजने, और फिर संभाल कि AJAX त्रुटि हैंडलर में है

यदि आप, आपके द्वारा केवल ajax अनुरोध भेजने के एक ajax प्रतिक्रिया प्राप्त कर सकते हैं सामान्य http अनुरोध भेजें तो आपको एक पॉपअप मिलेगा। इसका नेट या जावा से कोई लेना देना नहीं है :)

+3

मुझे नहीं पता कि AJAX अनुरोध, जो 401 प्रतिक्रिया देता है, प्रमाणीकरण पॉपअप दिखाने के लिए ब्राउज़र को ट्रिगर करना चाहिए, लेकिन ऐसा होता है। मैं एक शुद्ध अनधिकृत AJAX अनुरोध कर रहा हूं और 401 प्रतिक्रिया वापस भेज रहा हूं, और इससे ब्राउजर को "प्रमाणीकरण आवश्यक" पॉपअप प्रदर्शित करने का कारण बनता है। अगर मैं अनधिकृत AJAX अनुरोध के लिए कुछ कस्टम प्रतिक्रिया कोड (उदाहरण के लिए 601) देता हूं, तो ब्राउज़र "प्रमाणीकृत आवश्यक" पॉपअप प्रदर्शित नहीं करता है। हालांकि AJAX त्रुटि हैंडलर चलता है और फिर मैं सामान्य अनुरोध का उपयोग कर ब्राउज़र को यूआरएल लॉगिन करने के लिए रीडायरेक्ट करने के लिए इसका उपयोग कर सकता हूं। यह दृष्टिकोण – Jatin

+0

काम करने लगता है वास्तव में विचार AJAX के माध्यम से एक वैध प्रतिक्रिया कोड भेजना था और इसे कॉलबैक हैंडलर में संभालना और पुनर्निर्देशित करना था :) – Abhi

0

समाधान here एमवीसी फ्रेमवर्क डिफ़ॉल्ट व्यवहार को हल करने के लिए एक कस्टम HttpModule लिखना है। एक बार जब मैं अंततः मॉड्यूल पंजीकृत करने में सक्षम था (cheers David Ebbo) यह मेरे लिए काम किया। आप SuppressAuthenticationRedirect पर कॉल करने के लिए अपना खुद का मानदंड चुनना चाह सकते हैं।

public class SuppressFormsAuthenticationRedirectModule : IHttpModule { 
    private static readonly object SuppressAuthenticationKey = new Object(); 

    public static void SuppressAuthenticationRedirect(HttpContext context) { 
    context.Items[SuppressAuthenticationKey] = true; 
    } 

    public static void SuppressAuthenticationRedirect(HttpContextBase context) { 
    context.Items[SuppressAuthenticationKey] = true; 
    } 

    public void Init(HttpApplication context) { 
    context.PostReleaseRequestState += OnPostReleaseRequestState; 
    context.EndRequest += OnEndRequest; 
    } 

    private void OnPostReleaseRequestState(object source, EventArgs args) { 
    var context = (HttpApplication)source; 
    var response = context.Response; 
    var request = context.Request; 

    if (response.StatusCode == 401 && request.Headers["X-Requested-With"] == 
     "XMLHttpRequest") { 
     SuppressAuthenticationRedirect(context.Context); 
    } 
    } 

    private void OnEndRequest(object source, EventArgs args) { 
    var context = (HttpApplication)source; 
    var response = context.Response; 

    if (context.Context.Items.Contains(SuppressAuthenticationKey)) { 
     response.TrySkipIisCustomErrors = true; 
     response.ClearContent(); 
     response.StatusCode = 401; 
     response.RedirectLocation = null; 
    } 
    } 

    public void Dispose() { 
    } 

    public static void Register() { 
    DynamicModuleUtility.RegisterModule(
     typeof(SuppressFormsAuthenticationRedirectModule)); 
    } 
} 
2

रूप Softlion कहा

यह एक आसान जवाब के साथ एक आम सवाल है। 401 को .NET प्रमाणीकरण मॉड्यूल द्वारा लॉगिन> पेज में 302 में परिवर्तित किया गया है। ब्राउज़र 401 केवल 302.

कभी नहीं यदि आप .net 4 का उपयोग कर रहे हैं और बाद में, तुम मेरे लिए नीचे

HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 

यह काम के ठीक कोड का उपयोग करें।

0

मेरे लिए यह सरल हो गया। अधिकांश गुमनाम प्रमाणीकरण के साथ IIS वेब साइटों को भी एक डिफ़ॉल्ट Windows प्रमाणीकरण सक्षम

Authentication configuration

विंडोज प्रमाणीकरण बंद करें जो कि लॉगिन स्क्रीन पॉप अप होता है, जब साइट एक ajax कॉल से 401 भी पता लगाता है।

<security> <authentication> <anonymousAuthentication enabled="true" /> <windowsAuthentication enabled="false" /> </authentication> </security>

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