बेसिक प्रमाणीकरण का उपयोग करके वेब साइट से उपयोगकर्ता को कैसे लॉग आउट करें?


279

यदि वह मूल प्रमाणीकरण का उपयोग कर रहा है, तो क्या वेब साइट से उपयोगकर्ता को लॉग आउट करना संभव है?

हत्या सत्र पर्याप्त नहीं है, क्योंकि उपयोगकर्ता के प्रमाणित हो जाने के बाद, प्रत्येक अनुरोध में लॉगिन जानकारी होती है, इसलिए उपयोगकर्ता अगली बार उसी क्रेडेंशियल्स का उपयोग करके साइट पर पहुंचता है।

अब तक एकमात्र समाधान ब्राउज़र को बंद करना है, लेकिन यह प्रयोज्य दृष्टिकोण से स्वीकार्य नहीं है।


1
बस उत्सुक। तुम ऐसा क्यों करना चाहते हो?
डीओके

17
एक अलग उपयोगकर्ता के रूप में लॉग इन करने में सक्षम होने के लिए।
मार्को

16
@ डॉक - यह एक मानक सामाजिक-हैकिंग चीज़ है: उपयोगकर्ताओं को अपने ब्राउज़र को खुला छोड़ते समय लॉग आउट करने में सक्षम होना चाहिए। मान लीजिए कि आपका कोई उपयोगकर्ता किसी सार्वजनिक मशीन पर साइट एक्सेस करता है? उन्हें स्पष्ट रूप से लॉग-ऑफ करने की आवश्यकता है ताकि अगला उपयोगकर्ता उनके रूप में साइट तक पहुंच न सके।
कीथ

@ डॉक समस्या यह भी है कि यह उपयोगकर्ता के लिए साइट के लॉगआउट को असंभव बनाता है। सर्वर प्राधिकरण कुकी और यहां तक ​​कि सत्र कुकी साफ़ कर सकता है। लेकिन जब ब्राउज़र /पेज लोड करने के लिए जाता है , तो वे स्वचालित रूप से फिर से लॉग इन होंगे।
इयान बॉयड

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

जवाबों:


170

बेसिक प्रमाणीकरण को लॉगिंग को प्रबंधित करने के लिए डिज़ाइन नहीं किया गया था। आप इसे कर सकते हैं, लेकिन पूरी तरह से स्वचालित रूप से नहीं।

आपको जो करना है वह यह है कि उपयोगकर्ता लॉगआउट लिंक पर क्लिक करें, और प्रतिक्रिया में '401 अनधिकृत' भेजें, उसी दायरे का उपयोग करके और सामान्य 401 के समान URL फ़ोल्डर स्तर पर आप लॉगिन का अनुरोध करते हुए भेजें।

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

संक्षेप में, लॉगआउट स्क्रिप्ट लॉगिन स्क्रिप्ट के तर्क का विरोध करता है, केवल तभी सफलता पृष्ठ लौटाता है यदि उपयोगकर्ता सही क्रेडेंशियल पास नहीं कर रहा है।

सवाल यह है कि कुछ हद तक उत्सुक "अपना पासवर्ड दर्ज न करें" पासवर्ड बॉक्स उपयोगकर्ता की स्वीकृति को पूरा करेगा। पासवर्ड मैनेजर जो पासवर्ड को ऑटो-फिल करने की कोशिश करते हैं, वे यहां भी प्राप्त कर सकते हैं।

टिप्पणी के जवाब में जोड़ने के लिए संपादित करें: फिर से लॉग-इन थोड़ी अलग समस्या है (जब तक आपको दो-चरण लॉगआउट / लॉगिन स्पष्ट रूप से आवश्यक नहीं है)। आपको दूसरी (जो संभवतः एक अलग उपयोगकर्ता नाम / पासवर्ड है) को स्वीकार करने की तुलना में, पुनः लिंक लिंक तक पहुँचने का पहला प्रयास (401) अस्वीकार करना होगा। ऐसा करने के कुछ तरीके हैं। एक वर्तमान उपयोगकर्ता नाम को लॉगआउट लिंक में शामिल करना होगा (उदाहरण के लिए / पुनः उपयोग करें? उपयोगकर्ता नाम), और अस्वीकार करें जब क्रेडेंशियल उपयोगकर्ता नाम से मेल खाता हो।


2
मैं इस दृष्टिकोण की कोशिश करूँगा। लॉगआउट की बात (इस मामले में) उपयोगकर्ता को विभिन्न उपयोगकर्ता के रूप में लॉग इन करने में सक्षम है, इसलिए यह पूरी तरह से स्वीकार्य समाधान है। स्वतः-भरण पासवर्ड के लिए, यह उपयोगकर्ता पर निर्भर है कि वह इसका उपयोग करेगा या नहीं। साभार
मार्को

क्या अब भी यही एकमात्र रास्ता है? मैंने एक ASP.Net MVC और jQuery का कार्यान्वयन किया है जो काम करता है, लेकिन मैं अभी भी इससे खुश नहीं हूं: stackoverflow.com/questions/6277919
कीथ

@ कीथ: अभी भी केवल यह और systemPAUSE का जवाब (जो सभी ब्राउज़रों पर काम नहीं करता है, लेकिन जब यह काम करता है तो मैनुअल दृष्टिकोण से अधिक चिकनी है)।
bobince

16
W3C HTML कल्पना पर बहुत सक्रिय है। लेकिन एचटीटीपी स्पेसिफिकेशन सुस्त है। W3C को यह समस्या लगभग दो दशक पहले तय करनी चाहिए थी। आरईएसटी सेवाओं के उपयोग में वृद्धि के साथ, एक मजबूत मूल प्रमाणीकरण विधि दिन की आवश्यकता है।
डोजो

9
यह स्थानीय 46 पर क्रोम 46 ब्राउज़िंग में ठीक से काम नहीं करता है। Chrome पुराने (सही) पासवर्ड और आपके द्वारा निर्दिष्ट नए पासवर्ड दोनों को सुरक्षित रखता है। लॉगआउट पृष्ठ पर नेविगेट करने के बाद, क्रोम नए पासवर्ड UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED का उपयोग करके अपने पेज पर सही ढंग से उपयोग करता है। पहले 401 के बाद, क्रोम पुराने (सही) पासवर्ड पर वापस लौट जाता है। तो यह वास्तव में पहली बार ऐसा लगता है कि पासवर्ड को हटा नहीं था।
vancan1ty

196

बॉबी द्वारा उत्तर के अलावा ...

अजाक्स के साथ आप अपने 'लॉगआउट' लिंक / बटन को जावास्क्रिप्ट फंक्शन में लगा सकते हैं। इस फ़ंक्शन को एक बुरे उपयोगकर्ता नाम और पासवर्ड के साथ XMLHttpRequest भेजें। यह वापस 401 प्राप्त करना चाहिए। फिर प्री-लॉगिन पेज पर document.location सेट करें। इस तरह, उपयोगकर्ता लॉगआउट के दौरान अतिरिक्त लॉगिन संवाद कभी नहीं देखेगा, और न ही खराब क्रेडेंशियल में रखना याद रखना होगा।


12
अच्छा हैक, उपयोगकर्ता को मैन्युअल रूप से खराब क्रेडेंशियल दर्ज करना संभवत: अधिकांश वेबएप्स के लिए स्वीकार्य नहीं है।
बिलमैन

1
बस सुनिश्चित करें कि XMLHttpRequest अतुल्यकालिक होने के लिए सेट नहीं है या आप पा सकते हैं कि लॉगआउट अनुरोध पूरा होने से पहले पुनर्निर्देशन हो जाएगा।
davidjb

5
आप लॉगिन के लिए भी इसी ट्रिक का उपयोग कर सकते हैं। इस तरह आप सर्वर के प्रमाणीकरण विधि को बदलने के बिना लॉगिन संवाद को अनुकूलित कर सकते हैं। यह लेख कुछ अच्छे विचार देता है: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
Stijn de Witt

1
@davidjb चूंकि सिंक्रोनस अनुरोधों को अब हटा दिया गया है, इसलिए वैकल्पिक समाधान उपयोगकर्ता को एसिंक्स अनुरोध के कॉलबैक में पुनर्निर्देशित कर सकता है।
हेडन शिफ

1
डेविड: क्रोम अब एक्सएचआर के लिए इसकी अनुमति देता है, और मैं पुष्टि कर सकता हूं कि यह अभी भी क्रोम कैनरी में काम कर रहा है। Bugs.chromium.org/p/chromium/issues/detail?id=435547
CpnCrunch

192

उपयोगकर्ता को https: // लॉग: out@example.com/ के लिंक पर क्लिक करें । यह अमान्य लोगों के साथ मौजूदा क्रेडेंशियल्स को अधिलेखित करेगा; उन्हें लॉग आउट करना।


19
यह अधिक उत्थान क्यों नहीं करता है? मेरे लिए एक सरल और काम करने वाले समाधान की तरह लगता है। इस दृष्टिकोण के साथ कोई ज्ञात समस्याएं हैं?
14

35
यह अब क्रोम में काम नहीं करेगा, जो सुरक्षा कारणों से किसी URL में क्रेडेंशियल्स की अनदेखी करता है।
थॉम

5
यह मेरे लिए काम किया :) मैं क्रोम संस्करण 32.0.1700.102
abnotei

6
समस्या: क्रोम के संस्करण 39.0 का उपयोग करते हुए, जब मैं इस विधि के माध्यम से लॉगआउट लिंक पर क्लिक करता हूं, तो क्रोम खराब लॉगिन क्रेडेंशियल्स को याद करता है, और हर पेज लोड पर नए लॉगिन क्रेडेंशियल्स के लिए संकेत देता है, जब तक कि मैं किसी भी निर्दिष्ट लॉगिन क्षमता के बिना example.com पर नहीं जाता, स्पष्ट क्रोम की स्मृति।
स्कॉट

4
नमस्ते, मैं इसे क्रोम पर https के लिए उपयोग नहीं कर सकता।
थिएन्खोई ट्रॅन

67

आप इसे पूरी तरह से जावास्क्रिप्ट में कर सकते हैं:

मूल प्रमाणीकरण प्रमाणीकरण को साफ़ करने के लिए IE के पास (लंबे समय के लिए) मानक API है:

document.execCommand("ClearAuthenticationCache")

जब यह काम करे तो सच्चा लौटना चाहिए। या तो झूठे, अपरिभाषित या अन्य ब्राउज़रों पर वापस लौटाता है।

नए ब्राउज़र (दिसंबर 2012 तक: क्रोम, फ़ायरफ़ॉक्स, सफारी) में "जादू" का व्यवहार है। यदि वे किसी भी फर्जी अन्य उपयोगकर्ता नाम के साथ एक सफल बुनियादी अधिकार अनुरोध देखते हैं (मान लें logout) तो वे क्रेडेंशियल कैश को साफ़ करते हैं और संभवतः इसे उस नए फर्जी उपयोगकर्ता नाम के लिए सेट करते हैं, जिसे आपको यह सुनिश्चित करने की आवश्यकता है कि सामग्री देखने के लिए मान्य उपयोगकर्ता नाम नहीं है।

इसका मूल उदाहरण है:

var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')

उपरोक्त करने का एक "अतुल्यकालिक" तरीका logoutउपयोगकर्ता नाम का उपयोग करके एक AJAX कॉल करना है । उदाहरण:

(function(safeLocation){
    var outcome, u, m = "You should be logged out now.";
    // IE has a simple solution for it - API:
    try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
    // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
    if (!outcome) {
        // Let's create an xmlhttp object
        outcome = (function(x){
            if (x) {
                // the reason we use "random" value for password is 
                // that browsers cache requests. changing
                // password effectively behaves like cache-busing.
                x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                x.send("")
                // x.abort()
                return 1 // this is **speculative** "We are done." 
            } else {
                return
            }
        })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
    }
    if (!outcome) {
        m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
    }
    alert(m)
    // return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)

आप इसे एक बुकमार्कलेट भी बना सकते हैं:

javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);


1
क्या इसके लिए logoutउपयोगकर्ता नाम और / या लॉगआउट URL के विशेष सर्वर-साइड हैंडलिंग की आवश्यकता होती है ?
ulidtko

1
@ulidtko नहीं, यह नहीं होना चाहिए - सभी हैंडलिंग क्लाइंट-साइड है। एकमात्र स्थिति जिसे विशेष हैंडलिंग की आवश्यकता होती है, यदि कोई उपयोगकर्ता कहा जाता logoutहै, तो मौजूद होता है और उत्पन्न पासवर्ड होता है। उस लगभग असंभव-दुर्लभ मामले में, उपयोगकर्ता आईडी को उस एक में बदलें जो आपके सिस्टम में मौजूद नहीं होगा।
davidjb

2
मैंने आज से ऊपर बुकमार्क का उपयोग किया है और मैं अच्छी तरह से काम करता हूं।
डेविड गिलेबा

मैंने इसका इस्तेमाल किया और इसने क्रोम और एफएफ के लिए काम किया। मुझे केवल $ _SESSION साफ़ करने के लिए अपने logout.php पृष्ठ पर एक अतिरिक्त "GET" करना था।
शहरी

2
बुकमार्क, एज पर भी काम करता है। बस के साथ उपयोग<a href='javascript:......need*/);'>Logout</a>
एरिक

21

फ़ायरफ़ॉक्स 40, क्रोम 44, ओपेरा 31 और IE 11 के लिए निम्न फ़ंक्शन की पुष्टि की गई है। ब्राउज़र का पता लगाने के लिए
बोउज़र का उपयोग किया जाता है, jQuery का भी उपयोग किया जाता है।

- secUrl एक पासवर्ड संरक्षित क्षेत्र का url है जिसमें से लॉग आउट करना है।
- redirUrl एक गैर पासवर्ड संरक्षित क्षेत्र (लॉगआउट सक्सेस पेज) के लिए यूआरएल है।
- आप रीडायरेक्ट टाइमर (वर्तमान में 200ms) बढ़ाना चाह सकते हैं।

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", secUrl, true);
        xmlhttp.setRequestHeader("Authorization", "Basic logout");
        xmlhttp.send();
    } else {
        alert("Logging out automatically is unsupported for " + bowser.name
            + "\nYou must close the browser to log out.");
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}


यह सबसे व्यापक उत्तर है
belidzs

क्या $.ajaxवेरिएंट के सिंक्रोनस ( async: false) और xmlhttpवेरिएंट के एसिंक्रोनस ( trueइन open()) होने का कोई कारण है ?
बोवी

1
Chrome अब रेंडरिंग इंजन ब्लिंक का उपयोग करता है, इसलिए आपको इसे बदलना (bowser.gecko)होगा (bowser.gecko || bowser.blink)
बोवी

1
जेको / ब्लिंक का उपयोग $.ajaxऔर वेबकिट का उपयोग क्यों करता है new XMLHttpRequest? जेको / ब्लिंक नहीं कर सकते XMLHttpRequestऔर वेबकिट भी करने में सक्षम होना चाहिए $.ajax? मैं उलझन में हूं।
रेमीएनएल

11

यहाँ jQuery का उपयोग करके एक बहुत ही सरल जावास्क्रिप्ट उदाहरण दिया गया है:

function logout(to_url) {
    var out = window.location.href.replace(/:\/\//, '://log:out@');

    jQuery.get(out).error(function() {
        window.location = to_url;
    });
}

यह उपयोगकर्ता को फिर से ब्राउज़र लॉग-इन बॉक्स दिखाए बिना लॉग आउट करता है, फिर उसे लॉग आउट पृष्ठ पर पुनर्निर्देशित करता है


1
window.location = window.location.href.replace (/: \ / \ //, ': // लॉग: आउट @');
sebhaase 10

10

यह मूल-प्रमाणीकरण के साथ सीधे संभव नहीं है।

सर्वर के लिए HTTP विनिर्देश में कोई तंत्र नहीं है जो ब्राउज़र को यह बताने के लिए कि उपयोगकर्ता पहले से ही प्रस्तुत क्रेडेंशियल्स को भेजना बंद कर दें।

"हैक्स" (अन्य उत्तर देखें) आम तौर पर XMLHttpRequest का उपयोग करके शामिल होते हैं, जो मूल रूप से आपूर्ति किए गए लोगों को अधिलेखित करने के लिए गलत क्रेडेंशियल के साथ एक HTTP अनुरोध भेजने के लिए।


12
सिद्धांत रूप में। अभ्यास साबित होता है अन्यथा अन्य उत्तरों से देखा जा सकता है।
स्टिजन डे विट

2
और जैसा कि आप अन्य उत्तरों से भी देख सकते हैं, विश्वसनीय, सुसंगत और असफल-सुरक्षित तरीके से नहीं!
jplandrain

5

यह IE / नेटस्केप / क्रोम के लिए काम कर रहा है:

      function ClearAuthentication(LogOffPage) 
  {
     var IsInternetExplorer = false;    

     try
     {
         var agt=navigator.userAgent.toLowerCase();
         if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
     }
     catch(e)
     {
         IsInternetExplorer = false;    
     };

     if (IsInternetExplorer) 
     {
        // Logoff Internet Explorer
        document.execCommand("ClearAuthenticationCache");
        window.location = LogOffPage;
     }
     else 
     {
        // Logoff every other browsers
    $.ajax({
         username: 'unknown',
         password: 'WrongPassword',
             url: './cgi-bin/PrimoCgi',
         type: 'GET',
         beforeSend: function(xhr)
                 {
            xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
         },

                 error: function(err)
                 {
                    window.location = LogOffPage;
             }
    });
     }
  }


  $(document).ready(function () 
  {
      $('#Btn1').click(function () 
      {
         // Call Clear Authentication 
         ClearAuthentication("force_logout.html"); 
      });
  });          

5

यह वास्तव में बहुत सरल है।

बस अपने ब्राउज़र में निम्नलिखित पर जाएं और गलत क्रेडेंशियल्स का उपयोग करें: http: // उपयोगकर्ता नाम: password@yourdomain.com

कि "आपको लॉग आउट करना चाहिए"।


1
लेकिन उपयोगकर्ता को एक वास्तविक उपयोगकर्ता होना चाहिए, othervise I को "401 अनधिकृत" मिला, लेकिन बैक बटन का उपयोग करके मैं पहले से लॉग इन उपयोगकर्ता के रूप में काम जारी रखने में सक्षम हूं। Abyss वेब सर्वर X1 (
2.11.1

1
डुप्लिकेट उत्तर (मैथ्यू वेलबोर्न के ऊपर देखें)।
स्किपी ले ग्रांड गौरौ सेप

3

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

Nginx के लिए उदाहरण:

location /logout {
    return 401;
}

error_page 401 /errors/401.html;

location /errors {
    auth_basic off;
    ssi        on;
    ssi_types  text/html;
    alias /home/user/errors;
}

त्रुटि पृष्ठ /home/user/errors/401.html:

<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>

मैं आगे का उपयोग कर सुझाव है कि http_hostमें 401.htmlबस के बजाय host, के रूप में पूर्व भी पोर्ट संख्या (मामले में एक गैर मानक पोर्ट का इस्तेमाल किया जा रहा है) कहते हैं
एमिल Koutanov

2
function logout() {
  var userAgent = navigator.userAgent.toLowerCase();

  if (userAgent.indexOf("msie") != -1) {
    document.execCommand("ClearAuthenticationCache", false);
  }

  xhr_objectCarte = null;

  if(window.XMLHttpRequest)
    xhr_object = new XMLHttpRequest();
  else if(window.ActiveXObject)
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  else
    alert ("Your browser doesn't support XMLHTTPREQUEST");

  xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
  xhr_object.send ("");
  xhr_object = null;

  document.location = 'http://yourserver.com'; 
  return false;
}

2
 function logout(url){
    var str = url.replace("http://", "http://" + new Date().getTime() + "@");
    var xmlhttp;
    if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
    else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4) location.reload();
    }
    xmlhttp.open("GET",str,true);
    xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
    xmlhttp.send();
    return false;
}

2

जो मैंने ऊपर पढ़ा उसके आधार पर मुझे एक सरल समाधान मिला जो किसी भी ब्राउज़र पर काम करता है:

1) आप लॉगआउट पृष्ठ पर आप अपने लॉगिन बैक एंड में अजाक्स कहते हैं। आपका लॉगिन बैक एंड लॉगआउट उपयोगकर्ता को स्वीकार करना चाहिए। एक बार बैक एंड स्वीकार करने के बाद, ब्राउज़र वर्तमान उपयोगकर्ता को साफ़ करता है और "लॉगआउट" उपयोगकर्ता को मानता है।

$.ajax({
    async: false,
    url: 'http://your_login_backend',
    type: 'GET',
    username: 'logout'
});      

setTimeout(function () {
    window.location.href = 'http://normal_index';
}, 200);

2) अब जब उपयोगकर्ता सामान्य इंडेक्स फाइल में वापस आ गया, तो वह उपयोगकर्ता "लॉगआउट" के साथ सिस्टम में स्वचालित रूप से प्रवेश करने की कोशिश करेगा, इस दूसरी बार आपको लॉगिन / पासवर्ड डायलॉग को लागू करने के लिए 401 के उत्तर के साथ ब्लॉक करना होगा।

3) ऐसा करने के कई तरीके हैं, मैंने दो लॉगिन बैक एंड बनाए हैं, एक जो लॉगआउट उपयोगकर्ता को स्वीकार करता है और एक ऐसा नहीं है। मेरा सामान्य लॉगिन पृष्ठ वह है जो स्वीकार नहीं करता है, मेरा लॉगआउट पृष्ठ उसी का उपयोग करता है जो इसे स्वीकार करता है।


2

मैंने अभी क्रोम (79), फ़ायरफ़ॉक्स (71) और एज (44) में निम्नलिखित परीक्षण किया है और यह ठीक काम करता है। यह स्क्रिप्ट समाधान लागू करता है जैसा कि ऊपर उल्लेखित अन्य।

बस एक "लॉगआउट" लिंक जोड़ें और जब क्लिक किया जाता है तो निम्न HTML लौटाएं

    <div>You have been logged out. Redirecting to home...</div>    

<script>
    var XHR = new XMLHttpRequest();
    XHR.open("GET", "/Home/MyProtectedPage", true, "no user", "no password");
    XHR.send();

    setTimeout(function () {
        window.location.href = "/";
    }, 3000);
</script>

1

यह जावास्क्रिप्ट सभी नवीनतम संस्करण ब्राउज़रों के लिए काम करना चाहिए:

//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined';   // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
    // At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera;              // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;


//Clear Basic Realm Authentication
if(isIE){
//IE
    document.execCommand("ClearAuthenticationCache");
    window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
    (function(safeLocation){
        var outcome, u, m = "You should be logged out now.";
        // IE has a simple solution for it - API:
        try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
        // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
        if (!outcome) {
            // Let's create an xmlhttp object
            outcome = (function(x){
                if (x) {
                    // the reason we use "random" value for password is 
                    // that browsers cache requests. changing
                    // password effectively behaves like cache-busing.
                    x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                    x.send("");
                    // x.abort()
                    return 1 // this is **speculative** "We are done." 
                } else {
                    return
                }
            })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u )) 
        }
        if (!outcome) {
            m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
        }
        alert(m);
        window.location = '/';
        // return !!outcome
    })(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
    window.location = 'http://log:out@'+Host+'/';
}


1

chrome://restartएड्रेस बार और क्रोम में टाइप करें , इसके सभी ऐप जो बैकग्राउंड में चल रहे हैं, रीस्टार्ट होंगे और ऑथर्ड पासवर्ड कैश को क्लीन किया जाएगा।


1

बस रिकॉर्ड के लिए, एक नया HTTP रिस्पांस हैडर कहा जाता है Clear-Site-Data। यदि आपके सर्वर रिप्लाई में Clear-Site-Data: "cookies"हेडर शामिल है , तो प्रमाणीकरण क्रेडेंशियल (न केवल कुकीज़) को हटा दिया जाना चाहिए। मैंने इसे Chrome 77 पर परीक्षण किया है लेकिन यह चेतावनी कंसोल पर दिखाई देती है:

Clear-Site-Data header on 'https://localhost:9443/clear': Cleared data types:
"cookies". Clearing channel IDs and HTTP authentication cache is currently not
supported, as it breaks active network connections.

और ऑर्टिकल क्रेडेंशियल्स को हटाया नहीं गया है, इसलिए यह बेसिक कोर लॉगआउट को लागू करने के लिए (अभी के लिए) काम नहीं करता है, लेकिन शायद भविष्य में होगा। अन्य ब्राउज़रों पर परीक्षण नहीं किया।

संदर्भ:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data

https://www.w3.org/TR/clear-site-data/

https://github.com/w3c/webappsec-clear-site-data

https://caniuse.com/#feat=mdn-http_headers_clear-site-data_cookies


1

भेजना https://invalid_login@hostname मैक पर सफारी छोड़कर ठीक हर जगह काम करता है (ठीक है, नहीं एज जाँच की लेकिन वहाँ भी काम करना चाहिए)।

जब उपयोगकर्ता HTTP बेसिक ऑथेंटिकेशन पॉपअप में 'पासवर्ड याद रखें' का चयन करता है तो लॉगआउट सफारी में काम नहीं करता है। इस स्थिति में पासवर्ड किचेन एक्सेस (फाइंडर> एप्लिकेशन> यूटिलिटीज> किचेन एक्सेस (या सीएमडी + स्पेस) और "किचेन एक्सेस" टाइप करें) में स्टोर किया जाता है। भेजनाhttps://invalid_login@hostname किचेन एक्सेस को प्रभावित नहीं करता है, इसलिए इस चेकबॉक्स के साथ मैक पर सफारी पर लॉगआउट करना संभव नहीं है। कम से कम यह है कि यह मेरे लिए कैसे काम करता है।

MacOS Mojave (10.14.6), सफारी 12.1.2।

नीचे दिया गया कोड फ़ायरफ़ॉक्स (73), क्रोम (80) और सफारी (12) में मेरे लिए ठीक काम करता है। जब कोई उपयोगकर्ता लॉगआउट पृष्ठ पर जाता है तो कोड निष्पादित हो जाता है और क्रेडेंशियल्स को छोड़ देता है।

    //It should return 401, necessary for Safari only
    const logoutUrl = 'https://example.com/logout'; 
    const xmlHttp = new XMLHttpRequest();
    xmlHttp.open('POST', logoutUrl, true, 'logout');
    xmlHttp.send();

इसके अलावा किसी कारण के लिए सफारी 'बेसिक पासवर्ड' चुने जाने पर भी HTTP बेसिक ऑथेंटिकेशन पॉपअप में क्रेडेंशियल सेव नहीं करता है। अन्य ब्राउज़र इसे सही ढंग से करते हैं।


0
  • एक सत्र आईडी (कुकी) का उपयोग करें
  • सर्वर पर सत्र आईडी को अमान्य करें
  • अमान्य सत्र आईडी वाले उपयोगकर्ताओं को स्वीकार न करें

जब कुकीज़ उपलब्ध न हों तो बेसिक ऑथेंटिकेशन को बैकअप लॉगइन स्कीम के रूप में पेश करना अच्छा है।
bobince

0

मैंने आधुनिक क्रोम संस्करणों के लिए mthoring का समाधान अपडेट किया है:

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit || bowser.chrome) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open(\"GET\", secUrl, true);
        xmlhttp.setRequestHeader(\"Authorization\", \"Basic logout\");\
        xmlhttp.send();
    } else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
        redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}

-1
    function logout(secUrl, redirUrl) {
        if (bowser.msie) {
            document.execCommand('ClearAuthenticationCache', 'false');
        } else if (bowser.gecko) {
            $.ajax({
                async: false,
                url: secUrl,
                type: 'GET',
                username: 'logout'
            });
        } else if (bowser.webkit) {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", secUrl, true);
            xmlhttp.setRequestHeader("Authorization", "Basic logout");
            xmlhttp.send();
        } else {
            alert("Logging out automatically is unsupported for " + bowser.name
                + "\nYou must close the browser to log out.");
        }
        setTimeout(function () {
            window.location.href = redirUrl;
        }, 200);
    }

मैंने निम्नलिखित तरीके से उपरोक्त का उपयोग करने की कोशिश की।

?php
    ob_start();
    session_start();
    require_once 'dbconnect.php';

    // if session is not set this will redirect to login page
    if( !isset($_SESSION['user']) ) {
        header("Location: index.php");
        exit;
    }
    // select loggedin users detail
    $res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
    $userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css"  />
<link rel="stylesheet" href="style.css" type="text/css" />

    <script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", secUrl, true);
        xmlhttp.setRequestHeader("Authorization", "Basic logout");
        xmlhttp.send();
    } else {
        alert("Logging out automatically is unsupported for " + bowser.name
            + "\nYou must close the browser to log out.");
    }
    window.location.assign(redirUrl);
    /*setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);*/
}


function f1()
    {
       alert("f1 called");
       //form validation that recalls the page showing with supplied inputs.    
    }
</script>
</head>
<body>

    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
            <li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
            <li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">

            <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
              <span class="glyphicon glyphicon-user"></span>&nbsp;Hi' <?php echo $userRow['userEmail']; ?>&nbsp;<span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Sign Out</a></li>
              </ul>
            </li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav> 

    <div id="wrapper">

    <div class="container">

        <div class="page-header">
        <h3>Coding Cage - Programming Blog</h3>
        </div>

        <div class="row">
        <div class="col-lg-12" id="div_logout">
        <h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
        </div>
        </div>

    </div>

    </div>

    <script src="assets/jquery-1.11.3-jquery.min.js"></script>
    <script src="assets/js/bootstrap.min.js"></script>


</body>
</html>
<?php ob_end_flush(); ?>

लेकिन यह केवल आपको नए स्थान पर पुनर्निर्देशित करता है। कोई लॉगआउट नहीं।

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