2009-05-30 10 views
13

Sto scrivendo alcune funzionalità dinamiche lato browser e utilizzo dell'autenticazione di base HTTP per proteggere alcune risorse. L'esperienza dell'utente è molto importante e altamente personalizzata.Come posso impedire a Firefox di richiedere nome utente/password con HTTP Basic Auth con JQuery AJAX?

Ecco un metodo JQuery semplice test che alla fine metterà alla prova se un utente ha fornito le giuste credenziali in una forma:

$(document).ready(function() { 
    $("#submit").click(function() { 
    var token = Base64.encode($('#username').val() + ':' + $('#password').val());   
    $.ajax({ 
     url: '/private', 
     method: 'GET', 
     async: false, 
     beforeSend: function(req) { 
     req.setRequestHeader('Authorization', 'test:password'); 
     }, 
     error: function(request, textStatus, error) { 
     if (request.status == 401) { 
      alert('401'); 
     } 
     } 
    }); 
    return false; 
    }); 
}); 

Se non sono autorizzati ad accedere /private, nel momento in cui dovrebbe vedere solo il casella di avviso. Tuttavia, su Firefox viene visualizzato un modulo di accesso fornito dal browser (per riprovare con nuove credenziali). Safari non lo fa.

Vogliamo controllare completamente l'esperienza con moduli personalizzati, dissolvenze, transizioni, ecc. Come posso mantenere la casella predefinita di Firefox da mostrare? (. Se questo sarà un problema quando si prova per IE, mi piacerebbe sentire le soluzioni anche lì)

+1

Annotare il follow-up all'indirizzo http://stackoverflow.com/questions/928967/can-i-coerce-apache-into-not-including-a--authenticate-header-for-failed-http. –

risposta

3

Sfortunatamente, sto colpendo lo stesso problema qui.

A mio parere, i browser non devono fornire una richiesta di xmlhttprequest. Vorrei davvero che qualcuno spingesse quella causa che le persone vogliono davvero passare a jQuery per le loro esigenze di autenticazione.

Bene, ecco l'aiuto che posso darti, ho trovato questa cosa di jQuery Digest, non ho idea di cosa faccia o altro, ma se qualcuno potesse prendere questo codice nel modo giusto, potremmo avere un'autenticazione jquery digest sistema.

https://www.openhub.net/p/digestj

penserei con questa nuova comoda opzione AuthDigestDomain, potremmo avere lo script precedente riscritto o qualsiasi altra cosa e avere l'area protetta 'legato' insieme e abbiamo potuto superare questo problema una volta per tutte. Bene ... buona fortuna =)

35

La soluzione è impostare l'intestazione WWW-Authenticate su un valore diverso da Basic. Per esempio impostarlo: login basato

WWW-Authenticate: None 

o

WWW-Authenticate: FormBased 

se si utilizza modulo. Quindi il browser non ti mostrerà una finestra di accesso.

+1

Come indicato nel commento di risposta della domanda correlata. Il 'WWW-Authenticate' dovrebbe indicare una (o più) sfida valida. E penso anche che "Nessuno" non è reale. http://stackoverflow.com/questions/1748374/http-401-whats-an-appropriate-www-authenticate-header-value#comment-33722946 – mems

+1

Si prega di cercare qui una soluzione su come risolvere questo con Java e ** Spring Security **: http://stackoverflow.com/questions/19079687/rest-call-on-expired-session-http-401-response-causes-browser-to-display-login/19102959#19102959 – lanoxx

+1

È * la soluzione *, anche se sembra irregolare. https://www.ietf.org/rfc/rfc2617.txt (4.6) specifica più schemi, tuttavia non limita a Basic, Digest ecc.Quindi è compito del client (browser) supportare uno schema o meno, se lo schema non è supportato, il browser non interagisce con l'utente. Uso questo approccio per il fallback trasparente da Windows SSO (SPNEGO) a un semplice accesso al modulo. BTW: funziona in modo affidabile in Chrome + IE quando si accede al server tramite nome host; non usare IP. – comeGetSome