BASIC kimlik doğrulaması kullanarak web sitesinden kullanıcı oturumunu nasıl kapatabilirim?


279

Temel kimlik doğrulaması kullanıyorsa, kullanıcının bir web sitesinden çıkış yapması mümkün müdür?

Öldürme oturumu yeterli değildir, çünkü kullanıcının kimliği doğrulandıktan sonra her istek oturum açma bilgilerini içerir, dolayısıyla kullanıcı aynı kimlik bilgilerini kullanarak siteye bir sonraki erişiminde otomatik olarak oturum açar.

Şimdiye kadar tek çözüm tarayıcıyı kapatmaktır, ancak bu kullanılabilirlik açısından kabul edilemez.


1
Sadece merak. Bunu neden yapmak istiyorsun?
DOK

17
Farklı bir kullanıcı olarak giriş yapabilme.
Marko

16
@DOK - Bu standart bir sosyal hackleme olayı: kullanıcılar tarayıcılarını açık bırakarak çıkış yapabilirler. Kullanıcılarınızdan birinin siteye herkese açık bir makinede eriştiğini varsayalım? Bir sonraki kullanıcının siteye kendileri olarak erişememesi için açıkça oturumu kapatmaları gerekir.
Keith

@DOK Kullanıcının siteden çıkış yapmasını imkansız hale getirme sorunu da vardır. Sunucu, yetkilendirme çerezini ve hatta oturum çerezini temizleyebilir. Ancak tarayıcı /sayfayı yüklemeye gittiğinde otomatik olarak tekrar oturum açacaktır.
Ian Boyd

Oturumu kapatmak için sahte bir istek gönderen yöntemi kullanıyorum, ancak AD'de 3 kez girişin başarısız olduğu bir strick sınırlaması olduğundan kullanıcıyı müşteriye kilitliyor. Bu nedenle, bu yöntemi dikkatli bir şekilde kullanmanızı öneririz (sahte bir istek gönderin).
Qianchao Pan

Yanıtlar:


170

Temel Kimlik Doğrulaması, oturumu kapatmayı yönetmek için tasarlanmamıştır. Tamamen otomatik olarak yapamazsınız.

Yapmanız gereken, kullanıcının oturum kapatma bağlantısını tıklatması ve bir oturum açma talebinde bulunduğunuz normal 401 ile aynı alanı ve aynı URL klasörü düzeyinde bir '401 Yetkisiz' göndermesi.

Daha sonra yanlış kimlik bilgileri girmeye yönlendirilmelidirler, örn. boş bir kullanıcı adı ve şifre girdiğinizde yanıt olarak "Başarıyla çıkış yaptınız" sayfasını gönderirsiniz. Yanlış / boş kimlik bilgileri önceki doğru kimlik bilgilerinin üzerine yazılır.

Kısacası, oturum kapatma komut dosyası oturum açma komut dosyasının mantığını tersine çevirir ve yalnızca kullanıcı doğru kimlik bilgilerini geçmiyorsa başarı sayfasını döndürür .

Soru, merak uyandıran biraz “şifrenizi girmeyin” şifre kutusunun kullanıcı kabulünü karşılayıp karşılamayacağıdır. Parolayı otomatik olarak doldurmaya çalışan parola yöneticileri de buraya girebilir.

Yoruma yanıt olarak eklemek için düzenleyin: yeniden giriş yapmak biraz farklı bir sorundur (açıkça iki adımlı bir oturuma / girişe ihtiyacınız yoksa). Yeniden giriş bağlantısına erişmek için ilk denemeyi ikinciyi kabul etmekten (muhtemelen farklı bir kullanıcı adı / parolaya sahip) reddetmeniz (401) gerekir. Bunu yapmanın birkaç yolu vardır. Birisi, mevcut kullanıcı adını oturum kapatma bağlantısına (örn. / Relogin? Kullanıcı adı) dahil etmek ve kimlik bilgileri kullanıcı adıyla eşleştiğinde reddetmek olacaktır.


2
Bu yaklaşımı deneyeceğim. Çıkış yapma noktası (bu durumda) kullanıcının farklı bir kullanıcı olarak oturum açmasını sağlamaktır, bu yüzden mükemmel kabul edilebilir bir çözümdür. Otomatik doldurma şifresine gelince, kullanması veya kullanmaması kullanıcıya bağlıdır. Teşekkürler
Marko

Hala tek yol bu mu? Çalışan bir ASP.Net MVC ve jQuery uygulaması yaptım, ama yine de memnun değilim: stackoverflow.com/questions/6277919
Keith

@Keith: Yine de sadece bu ve systemPAUSE'nin yanıtı (tüm tarayıcılarda çalışmaz, ancak çalışırken manuel yaklaşımdan daha pürüzsüzdür).
bobince

16
W3C, HTML spesifikasyonunda çok etkindir. Ancak HTTP spesifikasyonu zayıflıyor. W3C bu sorunu yaklaşık yirmi yıl önce çözmüş olmalıydı. REST hizmetlerinin kullanımındaki artışla birlikte, günün yerel bir kimlik doğrulama yöntemine ihtiyaç duyulmaktadır.
Dojo

9
Localhost'ta Chrome 46'ya göz atmada bu düzgün çalışmıyor gibi görünüyor. Chrome, hem eski (doğru) şifreyi hem de belirttiğiniz yeni şifreyi koruyor gibi görünüyor. Oturumu kapatma sayfasına gittikten sonra, krom SİTENİZDEKİ SAYFADAN YETKİSİZLEŞTİRİLEN A 401 SORUN GİDERİLEN yeni şifreyi doğru bir şekilde kullanır. İlk 401'den sonra Chrome eski (doğru) şifreye geri döner. Görünüşe göre şifreyi gerçekten silmedi.
vancan1ty

196

Bobince'nin cevabına ek olarak ...

Ajax ile 'Çıkış' bağlantınızı / düğmenizi bir Javascript işlevine bağlayabilirsiniz. Bu işlevin XMLHttpRequest öğesini kötü bir kullanıcı adı ve parola ile göndermesini sağlayın. Bu işlem 401 değerini geri almalıdır. Daha sonra document.location özelliğini tekrar giriş öncesi sayfasına ayarlayın. Bu şekilde, kullanıcı oturumu kapatma sırasında hiçbir zaman ekstra oturum açma iletişim kutusunu görmez veya kötü kimlik bilgileri girmeyi unutmaz.


12
İyi bir saldırı, kullanıcının manuel olarak hatalı kimlik bilgilerini girmesi çoğu webapps için kabul edilemez.
BillMan

1
XMLHttpRequest öğesinin eşzamansız olarak ayarlanmadığından emin olun veya çıkış yönlendirme isteği tamamlanmadan önce yönlendirmenin gerçekleşeceğini görebilirsiniz.
davidjb

5
Aynı hileyi giriş için de kullanabilirsiniz. Bu şekilde, sunucunun kimlik doğrulama yöntemini değiştirmek zorunda kalmadan oturum açma iletişim kutusunu özelleştirebilirsiniz. Bu makale bazı iyi fikirler veriyor: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
Stijn de Witt

1
@davidjb Eşzamanlı isteklerin artık kullanımdan kaldırıldığı düşünüldüğünde, kullanıcıyı eşzamansızlık isteğinin geri çağrısında yönlendirmek için alternatif bir çözüm olabilir.
Hayden Schiff

1
David: Chrome şimdi XHR'ler için buna izin veriyor ve hala krom kanarya'da çalıştığını doğrulayabilirim. bugs.chromium.org/p/chromium/issues/detail?id=435547
CpnCrunch

192

Kullanıcının https: // log: out@example.com/ bağlantısını tıklamasını isteyin . Bu, mevcut kimlik bilgilerinin geçersiz olanlarla üzerine yazılacaktır; oturumu kapatın.


19
Neden daha fazla oy almıyor? Bana basit ve çalışan bir çözüm gibi görünüyor. Bu yaklaşımla ilgili bilinen herhangi bir sorun var mı?
amoebe

35
Bu, Chrome'da güvenlik nedeniyle bir URL'deki kimlik bilgilerini yok sayar.
Thom

5
Bu benim için çalıştı :) Chrome Sürüm 32.0.1700.102 kullanıyorum
abottoni

6
sorun: Chrome'un 39.0 sürümünü kullanma, Bu yöntemle çıkış bağlantısını tıkladığımda, Chrome kötü giriş kimlik bilgilerini hatırlar ve belirtilen giriş bilgileri olmadan example.com'a gidene kadar her sayfa yüklemesinde yeni giriş kimlik bilgilerini ister . krom hafızasını temizle.
Scott

4
Merhaba, Chrome'da https için kullanamıyorum.
thienkhoi tran

67

Tamamen JavaScript ile yapabilirsiniz:

IE, Temel Kimlik Doğrulama önbelleğini temizlemek için (uzun süre) standart API'ye sahiptir:

document.execCommand("ClearAuthenticationCache")

Çalıştığında doğru dönmelidir. Diğer tarayıcılarda false, undefined veya blows döndürür.

Yeni tarayıcılar (Aralık 2012 itibariyle: Chrome, FireFox, Safari) "sihirli" davranışa sahiptir. Herhangi bir sahte diğer kullanıcı adıyla başarılı bir temel kimlik doğrulama isteği görürlerse (diyelim logout) kimlik bilgileri önbelleğini temizler ve muhtemelen içeriği görüntülemek için geçerli bir kullanıcı adı olmadığından emin olmanız gereken yeni sahte kullanıcı adı için ayarlarlar.

Bunun temel örneği:

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

Yukarıdakileri yapmanın "eşzamansız" bir yolu, logoutkullanıcı adını kullanarak bir AJAX çağrısı yapmaktır . Misal:

(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*/)

Bir yer işareti de yapabilirsiniz:

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
Bu, logoutkullanıcı adı ve / veya oturum kapatma URL'sinin sunucu tarafında özel olarak işlenmesini gerektiriyor mu ?
ulidtko

1
@ulidtko Hayır, olmamalı - tüm işlemler istemci tarafındadır. Özel işlem gerektirecek tek durum, çağrılan bir kullanıcının logoutvar olması ve oluşturulan parolaya sahip olmasıdır. Neredeyse imkansız olan nadir durumlarda, kullanıcı kimliğini sisteminizde bulunmayacak şekilde değiştirin.
davidjb

2
Bugün yer imini kullandım ve iyi çalışıyorum.
David Gleba

Bunu kullandım ve Chrome ve FF için çalıştı. Ben sadece $ _SESSION temizlemek için logout.php sayfamda fazladan bir "GET" yapmak zorunda kaldı.
kentsel

2
Yer işareti Edge'de de çalışır. Basitçe kullanın<a href='javascript:......need*/);'>Logout</a>
Eric

21

Firefox 40, Chrome 44, Opera 31 ve IE 11 için aşağıdaki fonksiyonun çalıştığı onaylanmıştır.
Bowser , tarayıcı tespiti için kullanılır, jQuery de kullanılır.

- secUrl, oturumu kapatmak için parola korumalı bir alanın URL'sidir.
- redirUrl, şifre korumalı olmayan bir alanın URL'sidir (oturum kapatma başarılı sayfası).
- yönlendirme zamanlayıcısını (şu anda 200 ms) artırmak isteyebilirsiniz.

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


bu en kapsamlı cevaptır
belidzs

İçin bir sebep var mı $.ajaxsenkron olmak varyantı ( async: false) ve xmlhttpvaryant olmak asenkron ( trueiçinde open())?
Bowi

1
Chrome artık Blink oluşturma motorunu kullanıyor, bu yüzden değiştirmeniz (bowser.gecko)gerekiyor (bowser.gecko || bowser.blink).
Bowi

1
Neden gecko / blink $.ajaxve webkit kullanıyor new XMLHttpRequest? Gecko / blink XMLHttpRequestve webkit de yapamaz $.ajaxmı? Kafam karıştı.
RemyNL

11

İşte jQuery kullanarak çok basit bir Javascript örneği:

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

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

Bu günlük kullanıcısı, tarayıcı giriş kutusunu tekrar göstermeden oturumu kapatır, ardından oturumu kapatılan bir sayfaya yönlendirir


1
window.location = window.location.href.replace (/: \ / \ //, ': // log: out @');
sebhaase

10

Temel Kimlik Doğrulama ile bu doğrudan mümkün değildir.

Sunucunun HTTP belirtiminde, tarayıcıya kullanıcının zaten sunmuş olduğu kimlik bilgilerini göndermeyi durdurmasını söyleyecek bir mekanizma yoktur.

Orijinal olarak sağlananların üzerine yazmak için yanlış kimlik bilgilerine sahip bir HTTP isteği göndermek için genellikle XMLHttpRequest kullanmayı içeren "hackler" (diğer yanıtlara bakın) vardır.


12
Teoride. Uygulama, diğer cevaplardan da görülebileceği gibi aksini ispatlamaktadır.
Stijn de Witt

2
Ve diğer cevaplardan da görebileceğiniz gibi, güvenilir, tutarlı ve başarısız bir şekilde değil!
jplandrain

5

IE / Netscape / Chrome için çalışıyor:

      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

Aslında oldukça basit.

Tarayıcınızda aşağıdakileri ziyaret edin ve yanlış kimlik bilgileri kullanın: http: // kullanıcı adı: password@alanadiniz.com

"Oturumu kapat".


1
Ama kullanıcı GERÇEK bir kullanıcı olmak zorunda, othervise "401 Yetkisiz" var, ama GERİ düğmesini kullanarak daha önce giriş yapmış bir kullanıcı olarak çalışmaya devam edebiliyoruz. Abyss web sunucusu X1 (2.11.1) üzerinde test edildi
user2956477

1
Yinelenen cevap (bkz. Yukarıdaki Matthew Welborn's).
Skippy le Grand Gourou

3

İhtiyacınız olan tek şey, bazı oturum kapatma URL'lerinde kullanıcıyı yönlendirmek ve 401 Unauthorizedüzerinde hata döndürmek . Hata sayfasında (temel kimlik doğrulaması olmadan erişilebilir olması gerekir), ana sayfanıza (şema ve ana makine adı dahil) tam bir bağlantı sağlamanız gerekir. Kullanıcı bu bağlantıyı tıklar ve tarayıcı tekrar kimlik bilgilerini ister.

Nginx örneği:

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;
}

Hata sayfası /home/user/errors/401.html:

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

Ben daha kullanarak öneririm http_hostiçinde 401.htmlyalnızca yerine hosteski de port numarası (bu durumda, bir standart dışı bağlantı kullanılıyor) eklerken,
Emil 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

Yukarıda okuduğum bilgilere dayanarak, herhangi bir tarayıcıda çalışan basit bir çözüm buldum:

1) oturumunuzu kapattığınızda, giriş arka ucunuza bir ajax çağırırsınız. Giriş arka tarafınızın çıkış yapmayı kabul etmesi gerekir. Arka uç kabul edildikten sonra, tarayıcı geçerli kullanıcıyı temizler ve "oturumu kapat" kullanıcısını alır.

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

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

2) Şimdi kullanıcı normal indeks dosyasına döndüğünde, sisteme "oturumu kapat" kullanıcısıyla otomatik olarak sisteme girmeye çalışacaktır.

3) Bunu yapmanın birçok yolu var, biri oturum kapatma kullanıcısını kabul eden ve diğeri kabul etmeyen iki giriş arka ucu oluşturdum. Normal giriş sayfam kabul etmeyen sayfayı, çıkış sayfam kabul eden sayfayı kullanıyor.


2

Chrome (79), Firefox (71) ve Edge (44) 'de aşağıdakileri test ettim ve iyi çalışıyor. Komut dosyası çözümünü yukarıda belirtildiği gibi uygular.

Bir "Çıkış" bağlantısı ekleyin ve tıklandığında aşağıdaki html'yi döndürün

    <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

Bu JavaScript, en son sürüm tarayıcıların tümü için çalışıyor olmalıdır:

//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

bunu uygulamanıza ekleyin:

@app.route('/logout')
def logout():
    return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})

bu dönüşü kullanmak daha iyi: dönüş ('Çıkış', 401)
Amir Mofakhar

1

yazın chrome://restartarka planda çalışan tüm uygulamalar ile, adres çubuğu ve krom, yeniden başlayacaktır ve Auth şifre önbellek temizlenecektir.


1

Sadece kayıt için yeni bir HTTP Yanıt Başlığı var Clear-Site-Data. Sunucu yanıtınız bir Clear-Site-Data: "cookies"başlık içeriyorsa , kimlik doğrulama bilgileri (yalnızca çerezler değil) kaldırılmalıdır. Chrome 77'de test ettim ancak bu uyarı konsolda gösteriliyor:

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.

Ve kimlik doğrulama bilgileri kaldırılmaz, bu nedenle (şimdilik) temel kimlik doğrulama oturumlarını uygulamak için işe yaramaz, ancak belki de gelecekte olacaktır. Diğer tarayıcılarda test yapmadı.

Referanslar:

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

Gönderme https://invalid_login@hostnameMac'te Safari dışında her yerde iyi çalışıyor (iyi, kontrol edilmemiş Edge ancak orada da çalışmalıdır).

Bir kullanıcı HTTP Temel Kimlik Doğrulaması açılır penceresinde 'parolayı hatırla' seçeneğini belirlediğinde oturumu kapatma işlemi çalışmıyor. Bu durumda parola Anahtarlık Erişimi'nde (Finder> Uygulamalar> Yardımcı Programlar> Anahtarlık Erişimi (veya CMD + SPACE ve "Anahtarlık Erişimi" yazın) depolanır. Gönderme https://invalid_login@hostnameAnahtarlık Erişimini etkilemez, bu nedenle bu onay kutusuyla Mac'te Safari'de çıkış yapmak mümkün değildir. En azından benim için böyle çalışıyor.

MacOS Mojave (10.14.6), Safari 12.1.2.

Aşağıdaki kod Firefox (73), Chrome (80) ve Safari'de (12) benim için iyi çalışıyor. Kullanıcı oturum kapatma sayfasına gittiğinde kod yürütülür ve kimlik bilgilerini bırakır.

    //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();

Ayrıca, herhangi bir nedenle Safari, 'şifreyi hatırla' seçili olsa bile kimlik bilgilerini HTTP Temel Kimlik Doğrulaması açılır penceresine kaydetmez. Diğer tarayıcılar bunu doğru şekilde yapar.


0
  • oturum kimliği kullan (çerez)
  • sunucudaki oturum kimliğini geçersiz kılma
  • Geçersiz oturum kimliğine sahip kullanıcıları kabul etme

Ayrıca, Temel Kimlik Doğrulaması'nın çerezlerin kullanılamadığı bir yedek giriş şeması olarak sunulması da iyidir.
bobince

0

MThoring'in modern Chrome sürümleri için çözümünü güncelledim:

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

Yukarıdakileri aşağıdaki şekilde kullanmayı denedim.

?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(); ?>

Ancak sizi yalnızca yeni bir konuma yönlendirir. Çıkış yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.