मैं ब्राउज़र के प्रमाणीकरण संवाद को कैसे दबा सकता हूं?


85

मेरे वेब एप्लिकेशन में एक लॉगिन पृष्ठ है जो एक AJAX कॉल के माध्यम से प्रमाणीकरण क्रेडेंशियल्स को प्रस्तुत करता है। यदि उपयोगकर्ता सही उपयोगकर्ता नाम और पासवर्ड दर्ज करता है, तो सब कुछ ठीक है, लेकिन यदि नहीं, तो निम्न होता है:

  1. वेब सर्वर यह निर्धारित करता है कि हालांकि अनुरोध में एक अच्छी तरह से गठित प्राधिकरण हेडर शामिल है, हेडर में क्रेडेंशियल्स सफलतापूर्वक प्रमाणित नहीं होते हैं।
  2. वेब सर्वर एक 401 स्थिति कोड लौटाता है और इसमें एक या एक से अधिक WWW-Authenticate हेडर समर्थित प्रमाणीकरण प्रकारों को सूचीबद्ध करता है।
  3. ब्राउज़र पता लगाता है कि XMLHttpRequest ऑब्जेक्ट पर मेरे कॉल की प्रतिक्रिया 401 है और प्रतिक्रिया में WWW-Authenticate हेडर शामिल हैं। यह उपयोगकर्ता नाम और पासवर्ड के लिए फिर से एक प्रमाणीकरण डायलॉग पॉप अप करता है।

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

संयोग से, सर्वर पर मेरा कोई नियंत्रण नहीं है, इसलिए इसे कस्टम स्टेटस कोड (यानी, 401 के अलावा कुछ और) वापस करना एक विकल्प नहीं है।

क्या कोई तरीका है जिससे मैं प्रमाणीकरण संवाद को दबा सकता हूं? विशेष रूप से, क्या मैं फ़ायरफ़ॉक्स 2 या बाद के संस्करण में प्रमाणीकरण आवश्यक संवाद को दबा सकता हूं? IE 6 और बाद में कनेक्ट [होस्ट] संवाद को दबाने का कोई तरीका है ?



लेखक से अतिरिक्त जानकारी संपादित करें (18 सितंबर):
मुझे यह जोड़ना चाहिए कि ब्राउज़र के प्रमाणीकरण संवाद के साथ असली समस्या यह है कि यह उपयोगकर्ता को अपर्याप्त जानकारी देता है।

उपयोगकर्ता ने लॉगिन पृष्ठ पर फ़ॉर्म के माध्यम से केवल एक उपयोगकर्ता नाम और पासवर्ड दर्ज किया है, उनका मानना ​​है कि उसने दोनों को सही ढंग से टाइप किया है, और उसने सबमिट बटन या हिट दर्ज पर क्लिक किया है। उसकी अपेक्षा यह है कि उसे अगले पृष्ठ पर ले जाया जाएगा या शायद यह बताया जाएगा कि उसने गलत तरीके से अपनी जानकारी दर्ज की है और उसे फिर से प्रयास करना चाहिए। हालांकि, वह इसके बजाय एक अप्रत्याशित संवाद बॉक्स के साथ प्रस्तुत किया गया है।

संवाद इस तथ्य को स्वीकार नहीं करता है कि उसने सिर्फ एक उपयोगकर्ता नाम और पासवर्ड दर्ज किया है । यह स्पष्ट रूप से नहीं बताता है कि कोई समस्या थी और उसे फिर से प्रयास करना चाहिए। इसके बजाय, संवाद बॉक्स उपयोगकर्ता को "साइट कहता है: ' [दायरे] ' जैसी गुप्त जानकारी के साथ प्रस्तुत करता है ।" जहां [क्षेत्र] एक छोटा क्षेत्र है, जिसे केवल एक प्रोग्रामर ही प्यार कर सकता है।

वेब ब्रॉसर डिज़ाइनर ध्यान देते हैं: कोई भी यह नहीं पूछेगा कि प्रमाणीकरण संवाद को कैसे दबाया जाए यदि संवाद केवल उपयोगकर्ता के अनुकूल था। पूरे कारण यह है कि मैं एक लॉगिन प्रपत्र कर रहा हूँ कि हमारे उत्पाद प्रबंधन टीम ठीक ही समझता है 'ब्राउज़रों प्रमाणीकरण संवाद भयंकर हो रहा है।


1
जवाब है कि अच्छा जवाब नहीं है। मेरीजन द्वारा सुझाए गए हैक जितने करीब होते हैं, उतने ही पास होते हैं। बेशक, सर्वर और आपके जावास्क्रिप्ट द्वारा समझे जाने वाले कस्टम प्रमाणीकरण का उपयोग करना, लेकिन ब्राउज़र द्वारा नहीं, यह चाल भी करेगा, यदि यह संभव है।
dgvid

मैं एक ही मुद्दे पर रहा हूँ और स्टैकओवरफ्लो पर यहाँ एक टिप्पणी में इस लिंक को पाया है (मेरे ब्लॉग पर नहीं): लाउडवॉकर.ब्लॉगस्पॉट.केएएक्स / 11 / 2015। आशा है कि यह आपकी मदद करेगा।
gies0r

जवाबों:


17

मुझे नहीं लगता कि यह संभव है - यदि आप ब्राउज़र के HTTP क्लाइंट कार्यान्वयन का उपयोग करते हैं, तो यह हमेशा उस संवाद को पॉप अप करेगा। दो हैक्स दिमाग में आते हैं:

  1. हो सकता है कि Flash इसे अलग तरह से हैंडल करता है (मैंने अभी तक कोशिश नहीं की है), इसलिए एक फ्लैश फिल्म होने से अनुरोध मदद कर सकता है।

  2. आप उस सेवा के लिए एक 'प्रॉक्सी' सेट कर सकते हैं जिसे आप अपने सर्वर पर एक्सेस कर रहे हैं, और यह प्रमाणीकरण हेडर को थोड़ा संशोधित करता है, ताकि ब्राउज़र उन्हें पहचान न सके।


"संभव नहीं" सही उत्तर प्रतीत होता है, हालांकि मुझे संदेह है कि "प्रॉक्सि" हैक चाल चलेगा।
dgvid

@Stobor आपके द्वारा पोस्ट किए गए डुप्लिकेट के लिए स्वीकृत उत्तर वास्तव में इस प्रश्न के उत्तर के रूप में वापस लिंक करता है!
8bitjunkie 14

3
@ 7SpecialGems अच्छा पकड़। मैं यह सुझाव नहीं दे रहा था कि यह एक धोखा था, मैं विशिष्ट उत्तर (WWW-Authenticate one) से जुड़ा था जो स्वीकृत उत्तर के 4 साल बाद पोस्ट किया गया था। हालाँकि, मुझे याद नहीं है कि मैं यह क्यों देख रहा था, या मैंने इसका परीक्षण कैसे किया।
स्टोबोर

1
मैं इस कोड द्वारा अनधिकृत 401 त्रुटि को पकड़ने की कोशिश करता हूं: $ .ajaxSetup ({statusCode: {401: function () {RedirectToLogin ();}}}}); लेकिन IE हमेशा ब्राउज़र का प्रमाणीकरण संवाद दिखाता है। मैं ASP.Net MVC 2 में इस संवाद को कैसे दबा सकता हूं?
पॉलपी

@PaPP, जैसा कहा गया है, आपको एक प्रॉक्सी की आवश्यकता है जो उनके डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर के 401 स्टेटस कोड रिस्पांस या किसी प्रकार के कस्टम सर्वर कार्यान्वयन को छीन लेगी।
Motes

51

मुझे यहाँ एक ही समस्या का सामना करना पड़ा, और मेरी कंपनी के बैकएंड इंजीनियर ने एक ऐसा व्यवहार लागू किया, जिसे जाहिर तौर पर एक अच्छा अभ्यास माना जाता है: जब किसी URL पर कॉल करने से 401 वापस आ जाता है, यदि क्लाइंट ने हेडर सेट किया है X-Requested-With: XMLHttpRequest, तो सर्वर www-authenticateहेडर को उसमें छोड़ देता है। प्रतिक्रिया।

साइड इफेक्ट यह है कि डिफ़ॉल्ट प्रमाणीकरण पॉपअप प्रकट नहीं होता है।

सुनिश्चित करें कि आपके एपीआई कॉल में X-Requested-Withहेडर सेट है XMLHttpRequest। यदि ऐसा है तो इस अच्छे अभ्यास के अनुसार सर्वर व्यवहार को बदलने के अलावा कुछ नहीं करना है ...


3
यदि बैकएंड जावा / स्प्रिंग आधारित है, तो DelegatingAuthenticationEntryPointआपके लिए इस व्यवहार को संभालता है।
डेरेक स्लिफ़

इसके लिए शुक्रिया। कई पुस्तकालयों ने डेविस
josephnvu

1
किसी भी विचार कैसे nginx में यह करने के लिए? "जब कोई URL 401 पर कॉल करता है, यदि क्लाइंट ने हेडर X-Requested-With: XMLHttpRequest सेट किया है, तो सर्वर इसकी प्रतिक्रिया में www-प्रमाणीकृत हेडर को छोड़ देता है।"
markmnl

18

निम्न स्थितियों को पूरा करने पर ब्राउज़र लॉगिन प्रॉम्प्ट को पॉप अप करता है:

  1. HTTP स्थिति 4xx है
  2. WWW-Authenticate हेडर प्रतिक्रिया में मौजूद है

यदि आप HTTP प्रतिक्रिया को नियंत्रित कर सकते हैं, तो आप WWW-Authenticateशीर्ष लेख को प्रतिक्रिया से हटा सकते हैं , और ब्राउज़र लॉगिन संवाद को पॉपअप नहीं करेगा।

यदि आप प्रतिक्रिया को नियंत्रित नहीं कर सकते हैं, तो आप WWW-Authenticateशीर्ष लेख को प्रतिक्रिया से फ़िल्टर करने के लिए एक प्रॉक्सी सेट कर सकते हैं ।

जहां तक ​​मुझे पता है (अगर मैं गलत हूं तो मुझे सुधारने के लिए स्वतंत्र महसूस करें), ब्राउज़र के WWW-Authenticateहेडर प्राप्त करने के बाद लॉगिन प्रॉम्प्ट को रोकने का कोई तरीका नहीं है ।


अच्छी जानकारी। मान्य WWW-Authenticateहेडर मानों के बारे में , stackoverflow.com/a/1748451/225217
ब्राइस रोनकस

6

मुझे एहसास है कि यह सवाल और इसके जवाब बहुत पुराने हैं। लेकिन, मैं यहीं समाप्त हो गया। शायद दूसरों को भी होगा।

यदि आपके पास 401 पर लौटने वाली वेब सेवा के लिए कोड तक पहुंच है। 401 के बजाय इस स्थिति में 403 (निषिद्ध) वापस करने के लिए बस सेवा को बदलें। 403 के जवाब में ब्राउज़र क्रेडेंशियल के लिए संकेत नहीं देगा। 403 है एक प्रमाणित उपयोगकर्ता के लिए सही कोड जो किसी विशिष्ट संसाधन के लिए अधिकृत नहीं है। जिससे ओपी की स्थिति प्रतीत होती है।

403 पर IETF दस्तावेज़ से:

एक सर्वर जो वैध क्रेडेंशियल्स प्राप्त करता है जो 403 (निषिद्ध) स्थिति कोड के साथ जवाब देने के लिए पर्याप्त नहीं है।


4

मोज़िला में आप इसे निम्न स्क्रिप्ट के साथ प्राप्त कर सकते हैं जब आप XMLHttpRequest ऑब्जेक्ट बनाते हैं:

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

दूसरी पंक्ति संवाद बॉक्स को रोकती है ...।


1
यह फ़ायरफ़ॉक्स 2 के तहत कुछ भी नहीं करता प्रतीत होता है। इसका परिणाम DOM सुरक्षा त्रुटि, NS_ERROR_DOM_SECURITY_ERR कोड 1000 फ़ायरफ़ॉक्स 3 के तहत होता है
dgvid

2

आप किस सर्वर तकनीक का उपयोग करते हैं और प्रमाणीकरण के लिए किसी विशेष उत्पाद का उपयोग करते हैं?

चूंकि ब्राउज़र केवल अपना काम कर रहा है, मेरा मानना ​​है कि आपको 401 स्थिति कोड वापस नहीं करने के लिए सर्वर साइड पर चीजों को बदलना होगा। यह कस्टम प्रमाणीकरण प्रपत्रों का उपयोग करके किया जा सकता है जो प्रमाणीकरण विफल होने पर बस फॉर्म को फिर से लौटाते हैं।


2

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


Moz- उपसर्ग का अर्थ है कोई क्रॉस-ब्राउज़र समर्थन (जब तक कि आप समान मापदंडों को नहीं पा सकते हैं जो प्रत्येक दूसरे ब्राउज़र में काम करते हैं)।
ब्रिलिएंड

2

jan.vdbergh में सच्चाई है, अगर आप 401 को सर्वर की ओर से किसी अन्य स्टेटस कोड के लिए बदल सकते हैं, तो ब्राउज़र पॉप-अप को नहीं पकड़ेगा और पेंट नहीं करेगा। एक अन्य समाधान दूसरे कस्टम हेडर के लिए डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर को बदल सकता है। मुझे विश्वास नहीं होता कि विभिन्न ब्राउज़र इसका समर्थन क्यों नहीं कर सकते, फ़ायरफ़ॉक्स के कुछ संस्करणों में हम xz अनुरोध mozBackgroundRequest के साथ कर सकते हैं, लेकिन अन्य ब्राउज़रों में ?? यहाँ, क्रोमियम में इस मुद्दे के साथ एक दिलचस्प लिंक है


1

मेरे पास एमवीसी 5 और वीपीएन के साथ यही मुद्दा है जहां जब भी हम वीपीज का उपयोग वीपीएन के बाहर करते हैं, तो हम इस ब्राउज़र संदेश का जवाब देने के लिए खुद को पाते हैं। का उपयोग करते हुए .net मैं बस का उपयोग कर त्रुटि के मार्ग को संभालता हूं

<customErrors defaultRedirect="~/Error"  >
  <error statusCode="401" redirect="~/Index"/>
</customErrors>

इस प्रकार अब तक इसने काम किया है क्योंकि होम कंट्रोलर के तहत इंडेक्स कार्रवाई उपयोगकर्ता को मान्य करती है। इस क्रिया में दृश्य, यदि लॉगऑन असफल है, तो लॉगिन नियंत्रण है जो मैं निर्देशिका सेवाओं में पारित LDAP क्वेरी का उपयोग करके उपयोगकर्ता को लॉग इन करने के लिए उपयोग करता हूं:

      DirectoryEntry entry = new DirectoryEntry("LDAP://OurDomain");
      DirectorySearcher Dsearch = new DirectorySearcher(entry);
      Dsearch.Filter = "(SAMAccountName=" + UserID + ")";
      Dsearch.PropertiesToLoad.Add("cn");

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


1

मैं नोड, एक्सप्रेस और पासपोर्ट का उपयोग कर रहा हूं और उसी मुद्दे से जूझ रहा था। मुझे यह स्पष्ट रूप से www-authenticateहेडर को खाली स्ट्रिंग पर सेट करके काम करने के लिए मिला । मेरे मामले में, यह इस तरह दिखता था:

(err, req, res, next) => {
  if (err) {
    res._headers['www-authenticate'] = ''
    return res.json(err)
  }
}

मुझे आशा है कि किसी की मदद करता है!


0

उन लोगों को एकजुट करने के लिए, जिनके बजाय C # की ActionAttributeवापसी 400होती है 401, और 'मूलभूत मूल संवाद' निगल जाता है।

public class NoBasicAuthDialogAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        filterContext.Result = new HttpStatusCodeResult(400);
    }
}

निम्नलिखित का उपयोग करें:

[NoBasicAuthDialogAuthorize(Roles = "A-Team")]
public ActionResult CarType()
{
 // your code goes here
}

आशा है कि यह आपको कुछ समय बचाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.