2010-04-21 15 views
26

Sto cercando una soluzione per l'utente che utilizza il pulsante Indietro del browser per navigare alla pagina precedente dopo aver effettuato il logout.Accesso autenticazione ASP.NET e disconnessione con pulsante Indietro del browser

Ho una versione dell'applicazione Web in asp.net e utilizzo di un provider di appartenenza personalizzato per l'autenticazione e l'autorizzazione. Tutto funziona bene, tranne quando l'utente fa clic sul link di disconnessione per uscire dall'applicazione e reindirizzare a una pagina di copertina predefinita, se l'uso fa clic sul BACK BUTTON sul proprio browser, tornerà effettivamente a dove erano prima e i dati verranno comunque visualizzati.

Ovviamente non possono fare nulla in quella pagina, fare clic su qualsiasi collegamento verranno reindirizzati nuovamente a una pagina di accesso. Ma avere queste informazioni rende molti utenti confusi.

Mi chiedo solo se è possibile cancellare la cronologia del browser in modo che l'utilizzo non possa tornare INDIETRO, oppure quando fanno clic sul pulsante Indietro per reindirizzare la pagina di accesso.

grazie

+1

+1 per una buona domanda. +1 per una buona domanda appena battuta -1 per cattiva conclusione. –

+0

che era fuori dalla mia pigrizia ~ ci proveremo ancora – Eatdoku

risposta

21

preoccuparsi della cronologia del browser e il pulsante di nuovo sta per darvi mal di testa e verruche genitali. Ci sono strutture integrate per gestire questo problema.

Il link/pulsante di logout deve puntare a una pagina contenente questo codice, insieme a qualsiasi altra cosa desideri.

[vb.net]

Imports System.Web.Security 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles MyBase.Load 
    Session.Abandon() 
    FormsAuthentication.SignOut() 
End Sub 

[C#]

using System.Web.Security; 

private void Page_Load(object sender, System.EventArgs e) 
{ 
    // Put user code to initialize the page here 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

codice proviene da questo page ed è valido ma la pagina è difficile per gli occhi.

Una buona domanda/risposta sul comportamento del pulsante di comando è disponibile here.

Aggiornamento:

ai sensi della conversazione che sto avendo con Matthew, disabilitare la cache su pagine singole che sono sensibili o volitile può essere fatto con codice come segue:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 

Sono curioso di sapere se funziona per te come fa per me.

+3

Questa non è la risposta a questa domanda. – nima

+0

Ciò disabiliterà anche il caching di css/js? Grazie: D –

+0

@Sky Sanders - Aspetta, non hai detto a qualcuno in una risposta qui sotto che Response.Cache.SetCacheability (HttpCacheability.NoCache) era lui "perdere la testa?". Indipendentemente da ciò, mi piace ancora la tua risposta – deebs

3

È possibile utilizzare javascript per disattivare il pulsante Indietro (in genere inviando l'utente a una pagina che inoltra a un'altra pagina, in modo che facendo clic su di nuovo si rinvia nuovamente). Un utente persistente può ancora tornare indietro di 2 passi nella cronologia e andare oltre il ciclo.

Quella pagina si trova nella cache del browser. Puoi chiedere al browser di non memorizzare nella cache nulla, ma questo rovinerà le prestazioni, a volte in modo drammatico, quindi non lo consiglierei.

+1

Matthew, perché suggerire un trucco quando c'è una funzionalità integrata per gestire il problema? –

+0

Session.Abandon e FormsAuthentication.SignOut non dice al browser di cancellare la sua cache (e il browser ei proxy in mezzo non devono onorare un'intestazione senza cache) Le pagine memorizzate nella cache possono ancora essere caricate, e se un la richiesta viene effettuata da una pagina nella cache del client dopo che la sessione è stata nix, senza sapere quale sarà il risultato, probabilmente NullReferenceExceptions mentre la pagina inizia a controllare le variabili di sessione (e un reindirizzamento alla pagina di accesso). – MatthewMartin

+0

Quindi la no-cache deve essere impostata in modo discreto su pagine sensibili o volatili che non dovrebbero essere riesumate. Non puoi controllare il cliente e provare solo ad aggiungere complessità. Se vogliono rinviare 3 clic in una 'pagina è scaduta' dopo aver effettuato il logout.?!?! più potere a loro. Ad ogni modo, non sto facendo il tifo solo dicendo ... p.s. usa @sky per assicurarmi di ottenere risposte ai commenti. –

-3

in realtà ho trovato una soluzione, ho aggiunto il seguente snippet al metodo di caricamento della pagina della pagina master.

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache); 

grazie per la risposta in ogni modo :)

+7

Ehi, girati, penso che tu abbia perso la testa da qualche parte ... ;-p Questo è come cercare di aggiustare un orologio con un martello. Per dirla gentilmente, questo si qualifica per un DWTF. Per favore riconsidera. –

+0

ok !! ... fammi provare ancora :) – Eatdoku

0

È possibile provare a utilizzare il HttpResponse.proprietà Cache se che avrebbe aiutato:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
Response.Cache.SetCacheability(HttpCacheability.Public); 
Response.Cache.SetValidUntilExpires(false); 
Response.Cache.VaryByParams["Category"] = true; 

if (Response.Cache.VaryByParams["Category"]) 
{ 
//… 
} 

Oppure potrebbe potrebbe bloccare la memorizzazione nella cache della pagina del tutto con HttpResponse.CacheControl, ma il suo stato deprecato in favore della proprietà Cache sopra:

Response.CacheControl = “No-Cache”; 

o si può davvero impazzire e fare tutto a mano:

Response.ClearHeaders(); 
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1 
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1 
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1 
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1 
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1 

Reference

1

Questo codice è molto utile

Response.Cache.SetCacheability(HttpCacheability.NoCache); 

solo mettere questo codice in caso di carico, sul master pagen nel caso, ma funziona solo per IE, per IE e Firefox ho usato

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
1

Your Answer

Una soluzione a questo è quello di aggiungere il seguente codice javascript alla sezione della pagina logout.aspx:

<script type="text/javascript"> 
window.history.forward(1); 
</script> 

Questo codice javascript inoltrerà l'utente indietro se l'utente accede alla pagina di disconnessione premendo il pulsante Indietro.

Se è necessario per garantire che l'utente non ha modo di tornare alle pagine dopo che il logout è necessario chiedere al browser di non memorizzare nella cache una qualsiasi delle pagine includendo il codice simile al seguente in ogni pagina:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
Problemi correlati