Domanda

Ho un requisito per un pulsante di logout esplicito per gli utenti in un'app Web ASP.NET. Sto usando IIS6 con autenticazione di base (SSL). Posso reindirizzare a un'altra pagina Web ma il browser mantiene viva la sessione. Ho cercato su Google e ho trovato un modo per farlo abilitando un controllo x attivo per comunicare con IIS e terminare la sessione. Mi trovo in un ambiente limitato che non consente l'autenticazione tramite moduli e anche i controlli x attivi non sono vietati. Qualcun altro ha avuto questo requisito e come lo ha gestito?

Va ??bene, questo è ciò di cui avevo paura. Ho visto risposte simili in rete e speravo che qualcuno avrebbe avuto modo di farlo. Grazie per il tuo tempo però. Immagino di poter usare javascript per impedire il pulsante Indietro come history.back ()

È stato utile?

Soluzione

Ho avuto difficoltà con questo per alcuni giorni.

L'uso dello specifico " document.execCommand di IE ('ClearAuthenticationCache'); 'non è per tutti una buona opzione: 1) cancella tutte le credenziali, il che significa che l'utente, ad esempio, verrà disconnesso da Gmail o da qualsiasi altro sito Web in cui è attualmente autenticato 2) è solo IE;)

Ho provato a utilizzare Session.Abandon () e quindi a reindirizzare a Default.aspx. Questo da solo non è sufficiente. Devi dire esplicitamente al browser che la richiesta che è stata fatta non è autorizzata. Puoi farlo usando qualcosa come:

response.StatusCode = 401;
response.Status = "401 Unauthorized";
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name");
resp.End();

Ciò comporterà quanto segue: l'utente fa clic sul pulsante di logout == > otterrà la finestra di login di base. TUTTAVIA: se preme Esc (la finestra di accesso scompare) e preme Aggiorna, il browser invia di nuovo automaticamente le credenziali, facendo in modo che l'utente si colleghi, anche se potrebbe pensare di essersi disconnesso.

Il trucco per risolverlo è quello di sputare sempre un "regno" unico . Quindi il browser NON rinvia le credenziali nel caso sopra descritto. Ho scelto di sputare la data e l'ora correnti.

response.StatusCode = 401;
response.Status = "401 Unauthorized";
string realm = "my application name";                
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now)));
resp.End();

Un'altra cosa che devi fare è dire al browser di non memorizzare nella cache la pagina:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetNoStore();

Con tutte queste cose a posto funziona (per me) in IE, ma fino ad ora non ero ancora in grado di impedire a Firefox di accedere all'utente quando l'utente preme Esc per la prima volta (nasconde la finestra di dialogo di accesso di base) e quindi refresh (F5) o il pulsante Indietro del browser.

Altri suggerimenti

Session.Abandon Il metodo distrugge tutti gli oggetti archiviati in un oggetto Session e rilascia le loro risorse. Se non si chiama il metodo Abandon in modo esplicito, il server distrugge questi oggetti quando la sessione scade.

Hai provato a chiamare Session.Abandon in risposta al clic sul pulsante?

Modifica :

Sembrerebbe che si tratti di un classico problema con il pulsante Indietro.

C'è poco da fare sul pulsante Indietro. Immagina che l'utente abbia appena aperto la pagina corrente in una nuova finestra, quindi abbia fatto clic sul pulsante logOut, quella pagina sembra disconnettersi ma non influirà immediatamente sul contenuto dell'altra finestra.

Solo quando tenteranno di navigare da qualche parte in quella finestra diventerà evidente che la loro sessione è andata.

Molti browser implementano il pulsante Indietro in modo simile (anche se non identico). Tornare alla pagina precedente non è necessariamente una navigazione per un punto di vista HTML / HTTP.

Questa è una soluzione per questo problema che funziona in IE6 e versioni successive.

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton>


<script>

    function logout()
    {
    document.execCommand("ClearAuthenticationCache",false);
    }
 </script>

Trovato da http://msdn.microsoft.com/en- us / library / bb250510% 28VS.85% 29.aspx

Web Team in breve Le tue credenziali, per favore

D: Jerry B. scrive, " Dopo che l'utente ha convalidato ed elaborato la sua richiesta, ora voglio invalidarlo. Supponendo che questa macchina sia in un ambiente aperto in cui chiunque possa camminare e usarla, voglio lanciare una nuova sfida ogni volta che un utente accede a un determinato modulo sul Web. & Quot;

A: Questa è una funzionalità richiesta frequentemente dal team di Internet Explorer e le brave persone laggiù ci hanno fornito un modo per farlo in Internet Explorer 6.0 SP1. Tutto quello che devi fare è chiamare il metodo execCommand sul documento, passando ClearAuthenticationCache come parametro del comando, in questo modo:

document.execCommand("ClearAuthenticationCache");

Questo comando cancella tutte le credenziali nella cache, in modo tale che se l'utente richiede una risorsa che necessita di autenticazione, il prompt per l'autenticazione si verifica nuovamente.

L'ho messo sul mio pulsante di collegamento di logout e funziona in IE6 sp1 e versioni successive:

OnClientClick="document.execCommand('ClearAuthenticationCache');"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top