2008-09-17 13 views
66

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

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

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

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

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


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

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

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

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

+1

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

+0

मैं एक ही मुद्दे पर किया गया है और stackoverflow पर एक टिप्पणी यहाँ (नहीं मेरे ब्लॉग) में इस लिंक मिल गया: http://loudvchar.blogspot.ca/2010/11/avoiding-browser-popup-for-401.html आशा है इससे आपकी मदद होगी। – gies0r

उत्तर

17

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

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

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

+0

"संभव नहीं" सही जवाब हो सकता है, हालांकि मुझे लगता है कि "proxie" हैक चाल करना होगा प्रकट होता है। – dgvid

+5

वास्तव में संभव है: http://stackoverflow.com/a/19102200 दिखाता है कि कैसे। – Stobor

+0

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

3

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

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

4

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

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

2 लाइन संवाद बॉक्स से बचाता है ....

+0

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

2

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

+0

moz- उपसर्ग के नीचे दिखाई देता कोई पार ब्राउज़र समर्थन का अर्थ है (जब तक आप समान पैरामीटर में से प्रत्येक में काम मिल सकता है अन्य ब्राउज़रों)। – Brilliand

2

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

38

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

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

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

+0

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

12

ब्राउज़र एक लॉगिन शीघ्र जब निम्नलिखित शर्तों के दोनों मिले हैं पॉप अप होता है:

  1. HTTP स्थिति 4xx है
  2. WWW-Authenticate हैडर प्रतिक्रिया

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

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

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

+0

अच्छी जानकारी। मान्य 'डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण' हेडर मानों के संबंध में, http://stackoverflow.com/a/1748451/225217 देखें –

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"); 

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

0

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

निम्नलिखित की तरह
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 
} 

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

5

मुझे एहसास है कि यह प्रश्न और उसके उत्तर बहुत पुराने हैं। लेकिन, मैं यहाँ समाप्त हुआ। शायद अन्य भी करेंगे।

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

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

0

मैं उपयोग कर रहा हूँ के साथ जवाब चाहिए प्राप्त करता है:

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

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

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

मुझे उम्मीद है कि किसी की मदद करेगा!