Domanda

In un recente progetto SharePoint, ho implementato una web part di autenticazione che dovrebbe sostituire la finestra di dialogo di autenticazione NTLM.Funziona correttamente purché l'utente fornisca credenziali valide.Ogni volta che l'utente fornisce credenziali non valide, la finestra di dialogo NTLM viene visualizzata in Internet Explorer.

Il mio codice Javascript che esegue l'autenticazione tramite XmlHttpRequest è simile al seguente:

function Login() {
   var request = GetRequest(); // retrieves XmlHttpRequest
   request.onreadystatechange = function() {
      if (this.status == 401) {     // unauthorized request -> invalid credentials
         // do something to suppress NTLM dialog box...
         // already tried location.reload(); and window.location = <url to authentication form>;
      }
   }
   request.open("GET", "http://myServer", false, "domain\\username", "password");
   request.send(null);
}

Non desidero che la finestra di dialogo NTLM venga visualizzata quando l'utente fornisce credenziali non valide.Dovrebbe invece essere eseguito il postback tramite il pulsante di accesso nel modulo di autenticazione.In altre parole, il browser non dovrebbe venire a conoscenza della mia richiesta non autorizzata.

C'è un modo per farlo tramite Javascript?

È stato utile?

Soluzione

Segnoil commento di è corretto;Il prompt di autenticazione NTLM viene attivato da un codice di risposta 401 e dalla presenza di NTLM come primo meccanismo offerto nell'intestazione WWW-Authenticate (Rif: Il protocollo di autenticazione NTLM).

Non sono sicuro di aver compreso correttamente la descrizione della domanda, ma penso che tu stia provando a racchiudere l'autenticazione NTLM per SharePoint, il che significa che non hai il controllo sul protocollo di autenticazione lato server, giusto?Se non sei in grado di manipolare il lato server per evitare di inviare una risposta 401 su credenziali non riuscite, non sarai in grado di evitare questo problema, perché fa parte delle specifiche (lato client):

L'oggetto XMLHttpRequest

Se l'UA supporta l'autenticazione HTTP [RFC2617], dovrebbe considerare le richieste che provengono da questo oggetto come parte dello spazio di protezione che include gli URI accessibili e inviare intestazioni di autorizzazione e gestire le richieste non autorizzate 401 in modo appropriato.se l'autenticazione fallisce, gli UA dovrebbero richiedere agli utenti le credenziali.

Pertanto, le specifiche richiedono effettivamente che il browser richieda all'utente di conseguenza se viene ricevuta una risposta 401 in un XMLHttpRequest, proprio come se l'utente avesse effettuato l'accesso direttamente all'URL.Per quanto ne so, l'unico modo per evitarlo davvero sarebbe avere il controllo sul lato server e far sì che le risposte 401 non autorizzate vengano evitate, come ha menzionato Mark.

Un ultimo pensiero è che potresti essere in grado di aggirare questo problema utilizzando un proxy, ad esempio uno script lato server separato su un altro server web.Lo script quindi prende un utente e passa il parametro e controlla l'autenticazione, in modo che il browser dell'utente non sia quello che sta effettuando la richiesta HTTP originale e quindi non riceva la risposta 401 che causa il prompt.Se lo fai in questo modo puoi scoprire dal tuo script "proxy" se ha fallito e, in tal caso, chiedere nuovamente all'utente finché non riesce.In caso di autenticazione riuscita, puoi semplicemente recuperare la richiesta HTTP come sei adesso, poiché tutto funziona se le credenziali sono specificate correttamente.

Altri suggerimenti

IIRC, il browser apre la finestra di dialogo di autenticazione quando nel flusso di richiesta ritorna quanto segue:

  • Stato HTTP di 401
  • Intestazione WWW-Autenticazione

Immagino che dovresti sopprimerne uno o entrambi.Il modo più semplice per farlo è avere un metodo di accesso che accetti un nome utente e una password Base64 (stai utilizzando HTTPS, giusto?) e restituisca 200 con uno stato valido/non valido.Una volta convalidata la password, è possibile utilizzarla con XHR.

Sono riuscito a farlo funzionare per tutti i browser tranne Firefox.Vedi il mio post sul blog qui sotto di qualche anno fa.Il mio post è rivolto solo a IE ma con alcune piccole modifiche al codice dovrebbe funzionare in Chrome e Safari.

http://steve.thelineberrys.com/ntlm-login-with-anonymous-fallback-2/

MODIFICARE:

L'essenza del mio post è racchiudere la tua chiamata XML JS in un'istruzione try catch.In IE, Chrome e Safari, ciò sopprimerà la finestra di dialogo NTLM.Non sembra funzionare come previsto in Firefox.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top