118 messaggi dal 09 luglio 2007
Salve, ho bisogno di alcune conferme per quanto riguarda la gestine dei cookie con authentication forms.

In parole povere io vorrei che l'utente che si logga abillitando il checkbox remember del controllo login mi rimanesse nei cookie per 15 giorni.

nel caso in cui l'utente non selezionasse il checkbox relativo al remember naturalmente entrassero in gioco le sessioni che hanno una scadenza che imposto da codice.

Inoltre vorrei che l'utente entrato la prima volta gli si impostasse la dicitura "Benvenuto", la seconda volta gli si impostasse la dicitura "Bentornato"

Io ho steso questo codice nella masterpage:
protected void Page_Load(object sender, EventArgs e)
    {
        

        Session["iduser"] = HttpContext.Current.User.Identity.Name;


        if (Request.Cookies["UserSettings"] != null)
        {


            var nome = (from u in up.GetAllUsers()
                        join pP in _profiloBusiness.ListaProfiliPersonali()
                        on u.iduser equals pP.iduser
                        where u.Username.Equals(HttpContext.Current.User.Identity.Name)
                        select pP.Nome).AsEnumerable().FirstOrDefault();

            HyperLink hladmin = (HyperLink)lgvUser.FindControl("hlamministratore");
            if (hladmin != null)
            {
                hladmin.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "Admin");
            }
            if (up.ExistUserInGroupPromotion(HttpContext.Current.User.Identity.Name))
            {

                HyperLink promozioniS = (HyperLink)lgvUser.FindControl("hlprodottispeciali");
                if (promozioniS != null)
                {

                    promozioniS.Visible = true;
                }

            }

            HyperLink hlchangeP = (HyperLink)lgvUser.FindControl("hlchangepassword");

            if (hlchangeP != null)
            {

                hlchangeP.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "Utente");
            }

            HyperLink hlinfo = (HyperLink)lgvUser.FindControl("hlpersonal");
            if (hlinfo != null)
            {
                hlinfo.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "Utente");
            }

            HyperLink hlamministratore = (HyperLink)lgvUser.FindControl("hlsuperadmin");
            if (hlamministratore != null)
            {

                hlamministratore.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "SuperAdmin");
            }


            Label lbelsalutonormal = (Label)lgvUser.FindControl("lblsaluto");
            if (lbelsalutonormal != null)
            {

                lbelsalutonormal.Text = "Bentornato/a Sig./ra";
            }

            Label lablnormal = (Label)lgvUser.FindControl("lblname");

            if (lablnormal != null)
            {


                lablnormal.Text = nome;

            }



        }
        else
        {

            if (!String.IsNullOrEmpty(Session["iduser"].ToString()))
            {
                var nome = (from u in up.GetAllUsers()
                            join pP in _profiloBusiness.ListaProfiliPersonali()
                            on u.iduser equals pP.iduser
                            where u.Username.Equals(HttpContext.Current.User.Identity.Name)
                            select pP.Nome).AsEnumerable().FirstOrDefault();

                HyperLink hladmin = (HyperLink)lgvUser.FindControl("hlamministratore");
                if (hladmin != null)
                {
                    hladmin.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "Admin");
                }
                if (up.ExistUserInGroupPromotion(HttpContext.Current.User.Identity.Name))
                {

                    HyperLink promozioniS = (HyperLink)lgvUser.FindControl("hlprodottispeciali");
                    if (promozioniS != null)
                    {

                        promozioniS.Visible = true;
                    }

                }

                HyperLink hlchangeP = (HyperLink)lgvUser.FindControl("hlchangepassword");

                if (hlchangeP != null)
                {

                    hlchangeP.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "Utente");
                }

                HyperLink hlinfo = (HyperLink)lgvUser.FindControl("hlpersonal");
                if (hlinfo != null)
                {
                    hlinfo.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "Utente");
                }

                HyperLink hlamministratore = (HyperLink)lgvUser.FindControl("hlsuperadmin");
                if (hlamministratore != null)
                {

                    hlamministratore.Visible = rp.IsUserInRole(HttpContext.Current.User.Identity.Name, "SuperAdmin");
                }


                Label lbelsalutonormal = (Label)lgvUser.FindControl("lblsaluto");
                if (lbelsalutonormal != null)
                {

                    lbelsalutonormal.Text = "Benvenuto/a Sig./ra";
                }

                Label lablnormal = (Label)lgvUser.FindControl("lblname");

                if (lablnormal != null)
                {


                    lablnormal.Text = nome;

                }

            }
        }


        /* if (Request.Cookies["UserSettings"] != null)
         {

                     
             if (Request.Cookies["UserSettings"]["user"] != null && DateTime.Parse(Request.Cookies["UserSettings"]["lastVisit"]) < DateTime.Now)
             {
         */





        /* else
         {

             

         }
 */


        /*
            }
        }
        */

    }

    protected void login_Authenticate(object sender, AuthenticateEventArgs e)
    {

        if (String.IsNullOrEmpty(((Login)lgvUser.FindControl("login")).UserName))
        {
            ((Login)lgvUser.FindControl("login")).FailureText = "Attenzione il campo Username è Obbligatorio";
            e.Authenticated = false;

        }
        if (String.IsNullOrEmpty(((Login)lgvUser.FindControl("login")).Password))
        {
            ((Login)lgvUser.FindControl("login")).FailureText = "Attenzione il campo Password è Obbligatorio";
            e.Authenticated = false;
        }

        string username = ((Login)lgvUser.FindControl("login")).UserName.ToString();
        string password = ((Login)lgvUser.FindControl("login")).Password.ToString();



        if (up.ValidateUser(username.Trim().Replace("''", "'"), password.Trim().Replace("''", "'")))
        {



            Session["iduser"] = HttpContext.Current.User.Identity.Name;


            if (((Login)lgvUser.FindControl("login")).RememberMeSet)
            {


                HttpCookie myCookie = new HttpCookie("UserSettings");
                myCookie["user"] = username;
                //myCookie["lastVisit"] = DateTime.Now.AddSeconds(11).ToString();
                myCookie.Expires = DateTime.Now.AddDays(15);
                Response.Cookies.Add(myCookie);
                //Session.Timeout = 21600;
            }
            else
            {
                //HttpCookie myCookie = new HttpCookie("UserSettings");
                //myCookie["user"] = username;
                //myCookie["lastVisit"] = DateTime.Now.AddSeconds(11).ToString();
                //myCookie.Expires = DateTime.Now.AddMinutes(-1);
                //Response.Cookies.Add(myCookie);
                Session.Timeout = 3;
            }

            FormsAuthentication.RedirectFromLoginPage(username, ((Login)lgvUser.FindControl("login")).RememberMeSet);

        }

        else
        {

            ((Login)lgvUser.FindControl("login")).FailureText = "Credenziali non corrette.Ritenta";

        }


    }


e nel web.config
<authentication mode="Forms">
      <forms loginUrl="Home.aspx"  defaultUrl="Home.aspx" timeout="300" protection="All" slidingExpiration="true" name="ecommerceAssiel">
      </forms>
    </authentication>
    <authorization>
      <allow users="*"/>
    </authorization>
    <anonymousIdentification enabled="true" cookieName="ecommerce_assiel"/>
    <membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
      <providers>
        <add name="SqlProvider" connectionStringName="AssielEcommerceConnectionString" applicationName="/" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" passwordFormat="Encrypted" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
      </providers>
    </membership>
    <trace pageOutput="false" enabled="false"/>
    <roleManager enabled="true" defaultProvider="RuoloProvider">
      <providers>
        <add connectionStringName="AssielEcommerceConnectionString" name="RuoloProvider" applicationName="ecommerce" type="System.Web.Security.SqlRoleProvider"/>
      </providers>
    </roleManager>


Volevo da parte Vostra una conferma sul lavoro da me eseguito e caso mai se ci sono dei suggerimenti su quest'ultimo.
Grazie ancora di tutto!

P.S.:Spero di essere stato chiaro
In parole povere io vorrei che l'utente che si logga abillitando il checkbox remember del controllo login mi rimanesse nei cookie per 15 giorni.


Credo che ti convenga dare un'occhiata alla classe FormsAuthenticationTicket.
Difatti, dietro le quinte, RedirectFromLoginPage non fa altro che impostare il cookie per l'autenticazione, che si appoggia, appunto, a questo ticket.
Per quanto riguarda la sessione, puoi eventualmente intervenire sul file di configurazione. A tal proposito, ti rimando al seguente link:

sessionState Element (ASP.NET Settings Schema)

Ti faccio anche qualche osservazione sul codice, dal momento che mi sembrava una delle tue richieste.

HyperLink hladmin = (HyperLink)lgvUser.FindControl("hlamministratore"); 
 
if (hladmin != null) 
{ 
    // ... 
}


Per eseguire direttamente il casting, devi essere sicuro che:

1) l'elemento sul quale fai il casting non abbia un riferimento a null.
2) che il tipo sul quale esegui il casting effettivamente lo consenta.

In sostanza, sarebbe stato più corretto scrivere come segue:

HyperLink hladmin = lgvUser.FindControl("hlamministratore") <b>as HyperLink</b>; 
 
if (hladmin != null) 
{ 
    // ... 
}


Un'altra cosa, perchè fai questo?
username.Trim().Replace("''", "'")


E poi, non ho capito molto bene quale uso vorresti fare di Session["iduser"].

Nicola Baldi
"Make things as simple as possible, but not simpler."
>>> My blog <<<
118 messaggi dal 09 luglio 2007
Ciao e Grazie tante per l'intervento in così breve tempo.

Avevo già dato un occhiata alla classe che tu mi suggerisci "FormsAuthenticationTicket" ed anche utilizzata(ma solo in parte),però successivamente ho preso in considerazione l'opzione che poi ho mostrato in questo mio post.

1: una volta che io ho impostato la precedente classe(da te suggerita), come leggo i cookie, e poi nello stesso modo di come facevo prima:

if (Request.Cookies["UserSettings"] != null)
{ 


2:Per le sessioni, ho già impostato il mio web.config come anche da te suggerito

<authentication mode="Forms">
      <forms loginUrl="Home.aspx" cookieless="AutoDetect"  defaultUrl="Home.aspx" timeout="3" protection="All" slidingExpiration="true" name="ecommerceAssiel">
      </forms>
    </authentication>
    <sessionState mode="InProc"  timeout="3"></sessionState>


e inserendo in session_end nel global.asax
le seguenti diciture:
Session.Abandon();
Response.Redirect("Home.aspx")


Per quanto riguarda le altre tue osservazioni(molto corrette):
per la prima situazione ti rispondo che sto facendo dei test di prova e quindi non ho messo il cast "as"

nel secondo caso, e cioè il punto del trim e del replace è un errore mio, visto che la stringa dell'username non avrà mai parole accentate, perchè ho fatto il controllo con le regular expression affinhè non si verificano certe situazioni.

Ultimo punto anche questo:
Session["iduser"]

era una prova per farmi passare controllare la scadenza delle sessioni, nel caso una persona non abiliti il check dei cookie

Grazie ancora per i tuoi suggerimenti preziosi, intanto i faccio le mie prove con FormsAuthenticationTicket

e ti faccio sapere
sanfra1976 ha scritto:
1: una volta che io ho impostato la precedente classe(da te suggerita), come leggo i cookie, e poi nello stesso modo di come facevo prima[...]

Ma è una domanda?
In tal caso dovresti essere più chiaro, perchè non ho capito cosa volevi chiedere esattamente.

sanfra1976 ha scritto:
[...]e inserendo in session_end nel global.asax
le seguenti diciture:
    
Session.Abandon();    
Response.Redirect("Home.aspx")    
[...]


Non ho capito a cosa ti serve esattamente questa parte.
Non mi sembra che abbia molto senso ciò che fai all'interno di quest'ultima parte di codice. Prova a spiegarti meglio.

sanfra1976 ha scritto:
[...]nel secondo caso, e cioè il punto del trim e del replace è un errore mio, visto che la stringa dell'username non avrà mai parole accentate, perchè ho fatto il controllo con le regular expression affinhè non si verificano certe situazioni.[...]

Scusa, ma se anche "username" contenesse parole accentate, qual'è lo scopo di username.Trim().Replace("''", "'")?

Nicola Baldi
"Make things as simple as possible, but not simpler."
>>> My blog <<<
118 messaggi dal 09 luglio 2007
Ciao, grazie ancora per la super velocità con cui mi rispondi!

La prima pèarte l'ho risolta, avevo impostato male la domanda, ma volevo capire, se il cookie che io salvo tramite la classe FormsAuthenticationTicket, come lo potevo richiamare nell'evento Page_OnLoad della pagina, se per caso era identico al sistema che io ho utilizzato precedentemente:

if (Request.Cookies["UserSettings"] != null)
{ 


e infatti tutto funziona perfettamente.

2 punto:
ho inserito quelle righe di codice all'interno del global.asax, perchè nonostante nel web.config abbia inserito i tag correttamente e anche le voci altrettanto correttamente,non sembra che la sessioni scada e che di conseguenza non mi ritorni alla pagina di defaultUrl che io ho impostato nel web.config

3 punto:
come che senso ha?
Io ho sempre impostato le stringhe a questo controllo nel caso devo fare una ricerca con like per gli accenti
Non mi sembra così strano e/o banale

Spero di essere stato un pò più chiaro di prima e scusa se non lo sono stato precedentemente.

P.S.: per quanto riguarda il punto 2, non mi spiego il perchè
Grazie ancora
sanfra1976 ha scritto:
volevo capire, se il cookie che io salvo tramite la classe FormsAuthenticationTicket, come lo potevo richiamare nell'evento Page_OnLoad della pagina[...]

Il ticket lo puoi recuperare nel modo seguente:

FormsIdentity identity = (FormsIdentity)User.Identity;     
FormsAuthenticationTicket ticket = identity.Ticket;

Oppure, in alternativa:

FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);

sanfra1976 ha scritto:
ho inserito quelle righe di codice all'interno del global.asax, perchè nonostante nel web.config abbia inserito i tag correttamente e anche le voci altrettanto correttamente,non sembra che la sessioni scada e che di conseguenza non mi ritorni alla pagina di defaultUrl che io ho impostato nel web.config

Occhio, perchè credo tu stia facendo un pò di confusione.
Lo stato della sessione è una cosa, la scadenza del cookie di autenticazione è un'altra...
Eventualmente, prova a postare il codice relativo alla creazione del ticket assieme alla sezione di authenticazione del file di configurazione.

sanfra1976 ha scritto:
come che senso ha?
Io ho sempre impostato le stringhe a questo controllo nel caso devo fare una ricerca con like per gli accenti
Non mi sembra così strano e/o banale

Ok, ammesso che non sia nè strano nè banale, ti sei mai chiesto se esista o meno una ragione specifica per farlo?
Quella sostituzione era una delle più classiche, poichè rappresentava uno dei motivi più frequenti di errore di esecuzione nelle query, oltre ad essere terreno fertile per attacchi di SQL Injection.
Ora, dal momento che la sostituzione viene consumata in occasione della chiamata al metodo ValidateUser, immagino che, in sostanza, di tale sostituzione dovrebbe occuparsene il tuo MembershipProvider (o chi si occupa concretamene del mapping).
Quest'ultimo eseguirà la query SQL in un contesto "parametrico", dove i parametri della medesima saranno incapsulati dal tipo System.Data.IDbDataParameter. SqlCommand, ad esempio, dietro le quinte esegue la validazione della collezione di parametri.
Concludendo, in uno scenario del genere la sostituzione che fai tu non ha molto senso.
Prova a consultare il seguente link per avere una panoramica di questo scenario:
How To: Protect From SQL Injection in ASP.NET

Nicola Baldi
"Make things as simple as possible, but not simpler."
>>> My blog <<<

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.