13 messaggi dal 04 gennaio 2012
Salve a tutti come da titolo ho un problema con il logout di una mia web application. Il processo di Login è gestito da un WebService in cui tutti i metodi pubblici hanno impostato enablesession = true.
Per effettuare il login controllo i dati dell'account, se esatti istanzio la mia classe Principal, creo il ticket e lo inserisco in un cookie.

In Global.asax poi gestisco l'evento di autenticazione con questo codice:
        public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
        {
            if (FormsAuthentication.CookiesSupported)
            {
                HttpCookie ck = Request.Cookies[Costanti.Private.Varie.AuthCookieName];
                if (ck != null)
                {
                    try
                    {
                        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ck.Value);
                        phsPrincipal pp = null; 
                        pp = phsPrincipal.Deserialize(ticket.UserData);
                        args.User = pp;
                    }
                    catch (Exception e)
                    {
                        // Decrypt method failed.
                    }
                }
            }
            else
            {
                throw new HttpException("Cookieless Forms Authentication is not " +
                                        "supported for this application.");
            }
        }


Adesso il processo di login funziona perfettamente: l'utente visita l'area privata solo ed esclusivamente se effettua il login, altrimenti viene ridiretto alla pagina di autenticazione.

Il problema nasce dalla procedura di Logout, che è come il login un webmethod all'interno dello stesso web service:
        [WebMethod(true)]
        [ScriptMethod]
        public void logout(bool clearSession = true)
        {
            FormsAuthentication.SignOut();

            Session.Abandon();
            if (clearSession)
            {
                Session.RemoveAll();
                Session.Contents.RemoveAll();
                Session.Clear();
            }

            if (Context != null)
            {
                if (Context.Request != null)
                    Context.Request.Cookies.Clear();

                if (Context.Response != null)
                    Context.Response.Cookies.Clear();

            }
        }


Richiamando tale metodo l'utente sembrerebbe automaticamente disconnesso, ma digitando l'indirizzo di una qualsiasi pagina dell'area riservata, anche una non visitata precedentemente, l'utente ha ormai libero accesso anche se teoricamente ha effettuato il logout.

Nel codice sopra riportato, per la disperazione provo a eliminare di tutto, più del necessario...

Dando uno sguardo con Google ho trovato diverse soluzioni, tra cui quelle di sostituire i cookie di autenticazione e di sessione con degli altri cookie vuoti e scaduti con gli stessi nomi, ma nemmeno quella soluzione funziona.

Analizzando la Request in debug, prima della chiamata al logout contiene 4 cookies, subito dopo questi vengono effettivamente eliminati, ma al caricamento di qualsiasi altra pagina tutti e 4 i cookies magicamente ritornano con gli stessi valori iniziali.

Ripetendo che ho provato anche la tecnica di sostituire i cookies di autenticazione e di sessione con altrettanti vuoti e omonimi, senza alcun successo, come posso effettuare realmente il logout?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.