2009-11-17 9 views
93

L'applicazione su cui sto lavorando al momento ha un valore di timeout della sessione. Se l'utente non ha interagito più a lungo di questo valore, la pagina successiva provano a caricare, verrà richiesto di effettuare il login.HTTP 401: cos'è un valore di intestazione Autenticato WWW appropriato?

Tutte le richieste effettuate vengono instradate attraverso questo meccanismo, che include le chiamate AJAX. Inizialmente stavamo inviando un'intestazione 200 con la pagina di accesso, che introduce alcuni problemi con AJAX poiché il codice viene eseguito se viene inviata una risposta 200 e la maggior parte dei dati inviati da queste chiamate RPC è JSON o JavaScript non formattato che viene valutato (non chiedere: |).

Ho suggerito che un 401 è migliore, dal momento che il nostro parser JSON non cercherà di consumare una pagina di login HTML .. :)

Quando reading the spec, però, ho notato che il campo WWW-Authenticate deve anche essere inviato.

Qual è un buon valore per questo campo? Sarà sufficiente il Application Login?

risposta

58

Quando indicando l'autenticazione di base HTTP torniamo qualcosa di simile:

WWW-Authenticate: Basic realm="myRealm" 

Mentre Basic è lo schema e il resto è molto dipendente tale regime. In questo caso, realm fornisce solo al browser un valore letterale che può essere visualizzato all'utente quando richiede l'ID utente e la password.

Ovviamente non si sta utilizzando Basic poiché non vi è alcun punto in cui scade la sessione quando si utilizza l'autenticazione di base. Presumo che tu stia utilizzando una forma di autenticazione basata su moduli.

Dal richiamo, Windows Challenge Response utilizza uno schema diverso e diversi argomenti.

Il trucco è che spetta al browser determinare quali schemi supporta e come risponde a loro.

L'intuito è che se si utilizza l'autenticazione basata su moduli è necessario rimanere nella pagina di relogin 200 + ma aggiungere un'intestazione personalizzata che il browser ignorerà ma che AJAX può identificare.

Per un'esperienza utente + AJAX davvero buona, ottenere lo script per aggrapparsi alla richiesta AJAX che ha trovato la sessione scaduta, attivare una richiesta di riconoscimento tramite un popup e, in caso di successo, inviare di nuovo la richiesta AJAX originale e continuare come normale.

Evitare l'imbroglio che fa sì che la sceneggiatura colpisca il sito ogni 5 minuti per mantenere in vita la sessione causando solo la sconfitta del punto di scadenza della sessione.

L'altra alternativa è masterizzare la richiesta AJAX ma questa è una scarsa esperienza utente.

+1

Grazie compagno, ora sto usando un 403, invece, dato che non è un reindirizzamento e include letteralmente il modulo di login al posto della pagina originale. Inoltre, si adatta meglio alle specifiche W3. Grazie per l'informazione comunque. –

+2

Vedere questa risposta su come è ancora possibile utilizzare HTTP 401: http://stackoverflow.com/questions/928874/how-do-i-keep-firefox-from-prompting-for-username-password-with-http-basic -auth/19102200 # 19102200 – lanoxx

+0

Sì, ho appena inserito qualcosa nell'intestazione dell'autenticazione WWW, suppongo. Un'altra risposta simile è http://stackoverflow.com/a/1088127/689161 O semplicemente violare le specifiche e non disturbare l'invio dell'intestazione (almeno alcuni siti lo fanno); 401 è ancora più appropriato di 403. – gengkev

-3

Quando la sessione utente scade, invio un codice di stato HTTP 204. Si noti che lo stato HTTP 204 non contiene contenuti.Sul lato client faccio questo:

xhr.send(null); 
if (xhr.status == 204) 
    Reload(); 
else 
    dropdown.innerHTML = xhr.responseText; 

Ecco la) funzione Reload (:

function Reload() { 
    var oForm = document.createElement("form"); 
    document.body.appendChild(oForm); 
    oForm.submit(); 
    } 
+2

Come mai stai usando HTTP 204? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204 –

Problemi correlati