Dal caso MSFT n. 111101555217932
Vedrai questa funzionalità con qualsiasi pagina web che accetta dati all'interno di una richiesta POST HTTP. La logica di Azure ACS è che il processo di invio dei dati dei moduli tramite un POST HTTP viene effettivamente visualizzato come una voce nella cronologia dei browser. Se si controlla la cronologia immediata del browser, la voce appare come "In lavorazione ..." nell'elenco. Questo ti consente di "navigare" verso questa voce. Una volta che si tenta di tornare a questa "pagina", il browser nota che il contenuto è già scaduto, quindi richiede all'utente che il contenuto è scaduto e chiede se si desidera inviare nuovamente la richiesta per ottenere la versione "aggiornata" di quella pagina dal server. Dopo aver fatto clic sul pulsante Riprova, i dati dei moduli vengono passati a ADFS e ADFS lo considera come una normale richiesta di accesso, in modo che autentica tale richiesta e restituisca il token SAML e reindirizzamenti automatici alla pagina Web originale.
Vedrai lo stesso comportamento anche con altri browser.
Quindi vogliamo sapere come evitare di consentire agli utenti di accedere come un altro utente semplicemente eseguendo il back, back, back, refresh. Ho avuto alcune discussioni con il nostro team di IE e il nostro team di ASP.NET e ci siamo inventati un paio di cose che potresti provare ad evitare questo problema.
Soluzioni alternative lato client
-
Un suggerimento del nostro team di IE è di modificare la tua pagina di accesso ADFS in modo che non accetti le credenziali di accesso direttamente. Invece contiene solo un pulsante che dice accesso. Quando l'utente fa clic su questo pulsante di accesso, si avrà qualche javascript che esegue la chiamata a window.open () per avviare una seconda piccola finestra di dialogo che si sposta su una seconda pagina ospitata nel sito Web di ADFS. La seconda pagina ADFS accetterà il nome utente e la password e quindi la invierà per l'autenticazione. Dopo che la finestra di dialogo è stata avviata, è possibile chiudere la finestra e utilizzare la finestra genitore per navigare verso l'applicazione del relying party.
-
Un altro suggerimento è provare una chiamata location.replace () come descritto qui: link Questa operazione rimuoverà una voce dall'elenco della cronologia mentre navighi in una nuova pagina.
Soluzioni alternative al lato server
-
Un'opzione consiste nel modificare la pagina di accesso ADFS per richiedere anche all'utente di inviare un valore basato sul tempo come parte dei dati del modulo. Supponiamo che tu abbia aggiunto un valore TimeSubmed al modulo e quando l'utente ha fatto clic sul pulsante di accesso hai uno script che imposta il valore sull'ora corrente e lo invia come parte dei dati di accesso. Quindi dal lato server verificherai questo valore e se fosse più di 2 o 5 secondi dopo l'ora corrente del server, potresti respingere il tentativo di accesso e inviare al cliente una nuova pagina di accesso per inserire manualmente il combinazione nome utente / password di nuovo.
-
Un altro suggerimento lato server è di manipolare la cronologia del browser per rimuovere quella voce "Working ...". Per fare ciò è possibile emettere script lato client all'interno dell'evento PreRender delle pagine. Quindi nella tua pagina di accesso potresti avere
private void WebForm1_PreRender(object sender, System.EventArgs e)
{
if (IsPostBack)
{
Response.Write("<html><head><script>location.replace('"+Request.Path+"');\n"
+"</script></head><body></body></html>\n");
Response.End();
}
La richiesta POST viene rimossa dalla cronologia di navigazione di IE. La cronologia conterrà solo richieste GET.
- Puoi anche nascondere la barra di navigazione del browser nel tuo chiosco e aggiungere direttamente i pulsanti indietro e avanti alle tue pagine. Dovresti gestire le funzionalità di navigazione della pagina con le tue pagine e ovviamente non consentire a un utente di navigare "Indietro" dalla pagina di accesso di ADFS.
Purtroppo non esiste un modo semplice per aggirare il problema di disabilitare la possibilità per qualcuno di inviare nuovamente i dati del modulo, anche se i dati del modulo vengono utilizzati per autenticare e accedere a un utente. Tra tutti i suggerimenti proposti, probabilmente implementerei la prima soluzione lato server in cui si passa semplicemente il tempo inoltrato e se si tratta di un certo delta lontano dal tempo del server, ignorare la richiesta perché è il ripubblicare di un precedente tentativo di accesso riuscito.