115 messaggi dal 01 novembre 2012
ciao hai ragione lo so che non va messa ma l'ho aggiunta solo oggi la chiusura all'inizio con la speranza che potessi risolvere ma non è servito a nulla poco fa mi si bloccata nuovamente è ho dovuto rifare il riavvio dell'app dall'IIS
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Nando,
proverei a semplificare molto quella funzione perché c'è un po' di caos lì in mezzo e non riesco a capire quale sia il reale intento.

Da una funzione chiamata VerificaLogin mi aspetto che restituisca un bool, dove True sta ad indicare che il login ha avuto successo, mentre False no. Se questo è quello che ti serve, allora prova così:

Public Class miaClasse
    Inherits System.Web.UI.Page

    Public Function VerificaLogin(ByVal login As String, ByVal password As String) As Boolean
        'Ottengo la connectionString dal web.config
        Dim connectionString = ConfigurationManager.ConnectionStrings("DB").ConnectionString
        Using conn As New MySqlConnection(connectionString)
            conn.Open()
            Using cmd As New MySqlCommand("SELECT Count(*) FROM tabpass where login=@login and sanha=@password", conn)
                cmd.Parameters.AddWithValue("login", login)
                cmd.Parameters.AddWithValue("password", password)
                Dim conto As Integer = Convert.ToInt32(cmd.ExecuteScalar())
                'Se il conto delle righe trovate è > 0, vuol dire che le credenziali erano valide
                Return conto > 0
            End Using
        End Using
    End Function
End Class


Alcuni suggerimenti:
  • Gli oggetti connection vanno creati e aperti solo nel momento in cui è necessario usarli, e vanno distrutti il prima il possibile, appena hai ottenuto il risultato.
  • Wrappa tutti gli oggetti di ADO.NET nel costrutto Using: anche se ti capita un'eccezione, almeno verranno distrutti correttamente;
  • Non restituire DataReader, perché questo ti costringe a tenere aperta la connessione oltre il termine della funzione. Se devi restituire un resultset, usa le classi disconnesse DataTable o DataSet. In questo caso non credo sia necessario dato che è sufficiente che VerificaLogin restituisca un bool;
  • Usa i DbParameter. Nel 2018 non è più concepibile che esistano ancora applicazioni passibili di sql injection. Daniele ha pubblicato uno script nel 2003, sono passati 15 anni.
    http://www.aspitalia.com/script/522/Utilizzare-Classe-SqlParameter-Prevenire-Attacchi-Tipo-SQLinjection.aspx
    Quanti rischi corrono le aziende italiane che usano queste applicazioni? Ne sono consapevoli?
  • La connection string è preferibile metterla nel web.config e non cablata nel codice. Nel nodo <configuration> metti:
      <connectionStrings>
        <add name="DB" connectionString="server=localhost;User Id=root;password=martina;database=tabpass" providerName="MySql.Data.MySqlClient" />
      </connectionStrings>
    


ciao,
Moreno
Modificato da BrightSoul il 30 aprile 2018 20.23 -

Enjoy learning and just keep making
115 messaggi dal 01 novembre 2012
Ciao Moreno, per come mi hai indicato tu è sicuramente pulito il codice ma io ho bisogno che la funzione VerificaLogin mi restituisca StrLogin e StrPwd in quanto la pagina di Login fa questo:

        Dim StrLogin As String = TxtLog.Text
        Dim StrPwd As String = TxtPwd.Text
        Dim gravando As New miaClasse
        Dim SRead As MySqlDataReader

        SRead = gravando.VerificaLogin(StrLogin, StrPwd)

        If SRead.HasRows = True Then

            Dim Utente As HttpCookie = Request.Cookies("CookiesGvotw")
            If (Utente Is Nothing) Then
                Utente = New HttpCookie("CookiesGvotw")
                Utente("Utente") = StrLogin
                Utente("Password") = StrPwd
            Else

            End If
            Response.Cookies.Add(Utente)
            SRead.Close()
            Server.Transfer("default.aspx")
        Else
            Label3.Text = "Login non riuscito Utente e/o Password Errata !"
            SRead.Close()
        End If



e ogni volta che ci si sposta in un altra pagina accedendo dal menù nel Page_Load ho Identity() che mi svolge questo:

    Private Sub Identity()
        Dim UtenteA As HttpCookie = Request.Cookies("CookiesGvotw")
        If (UtenteA Is Nothing) Then
            Response.Redirect("~/WebLogin.aspx")
        Else
            Dim LeggiUtente As String
            Dim LeggiPassword As String
            LeggiUtente = ""
            LeggiPassword = ""
            Dim gravando As New miaClasse
            Dim strlogin As String
            Dim dealer_ As String
            Dim strPwd As String
            Dim cookieCols As New HttpCookieCollection
            cookieCols = Request.Cookies

            strlogin = HttpContext.Current.Request.Cookies("CookiesGvotw")("Utente").ToString()
            strPwd = HttpContext.Current.Request.Cookies("CookiesGvotw")("Password").ToString()


            dealer_ = ""
            Dim SRead As MySqlDataReader
            SRead = gravando.VerificaLogin(strlogin, strPwd)
            If SRead.HasRows = True Then
                'permette di ACCEDERE alla Pagina Web App
                Dim ServerString As String = "Server=localhost;User Id=root;Password=martina;Database=dbgvo"
                Dim SQLCon As MySqlConnection = New MySqlConnection
                SQLCon.ConnectionString = ServerString
                Try
                    If SQLCon.State = ConnectionState.Closed Then
                        SQLCon.Open()
                    Else
                        SQLCon.Close()
                    End If
                Catch ex As Exception
                    ClientScript.RegisterStartupScript(Me.GetType(), "ClientScript", "alert (ex.ToString)", True)
                End Try

                Dim SComando As New MySqlCommand("SELECT * FROM tabpass where login ='" & strlogin & "' and sanha='" & strPwd & "'", SQLCon)
                'Creo comando lettura
                Dim SRead_D As MySqlDataReader
                SRead_D = SComando.ExecuteReader
                While SRead_D.Read
                    Label53.Text = SRead_D("dealer")
                    Label52.Text = SRead_D("nome")
                    Label54.Text = SRead_D("desc_ruolo")
                    Label55.Text = SRead_D("ruolo")
                End While
                SRead.Close()
                SRead_D.Close()
                SQLCon.Close()
            Else
                SRead.Close()
                SQLCon.Close()
                Response.Redirect("~/WebLogin.aspx")
            End If
        End If
    End Sub


Modificato da modelrc il 02 maggio 2018 22.26 -
Modificato da modelrc il 02 maggio 2018 22.37 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Nando,


ho bisogno che la funzione VerificaLogin mi restituisca StrLogin e StrPwd

Non è necessario, la VerificaLogin può restituire un bool perché variabili StrLogin e StrPwd esistono già al di fuori della funzione. Guarda, puoi riscrivere così:

Dim credenzialiValide As Boolean = gravando.VerificaLogin(StrLogin, StrPwd)

        If credenzialiValid Then

            Dim Utente As HttpCookie = Request.Cookies("CookiesGvotw")
            If (Utente Is Nothing) Then
                Utente = New HttpCookie("CookiesGvotw")
                Utente("Utente") = StrLogin
                Utente("Password") = StrPwd
            End If
            Response.Cookies.Add(Utente)
            Server.Transfer("default.aspx")
        Else
            Label3.Text = "Login non riuscito Utente e/o Password Errata !"
        End If

Vedo che è stato realizzato un sistema di autenticazione completamente custom, che non è sicuro come quello fornito da ASP.NET (dato che la password vive in chiaro su un cookie) e che deve aver richiesto uno sforzo non necessario.

Cerca informazioni sulla FormsAuthenticatione e in particolare sul metodo FormsAuthentication.SetAuthCookie che serve ad emettere automaticamente un cookie cifrato e perciò sicuro, che non richiederà la riverifica della credenziali ad ogni richiesta.


ogni volta che ci si sposta in un altra pagina accedendo dal menù nel Page_Load ho Identity() che mi svolge questo:

Ti consiglio di sostituire quella parte iniziando a usare la FormsAuthentication, per maggiore sicurezza dell'applicazione e dei dati degli utenti.

ciao,
Moreno

Enjoy learning and just keep making
115 messaggi dal 01 novembre 2012
Ciao Moreno, credo di aver messo in pratica la tua indicazione in merito al problema che mi si verifica, ora devo solo testare il tutto a partire da domani, per ora però l'altra tua indicazione sicuramente utile in merito all'uso del FormsAuthenticatione l'ho rimandata, andiamo per step, a breve ti faccio sapere come va.

un saluto

Nando
115 messaggi dal 01 novembre 2012
Ciao Moreno, ho messo in pratica le tue indicazioni e ora non mi va più in crash per giunta mi è migliorata la velocità di accesso alle varie pagine quindi che dire problema risolto con successo, grazie sempre preziosi i tuoi consigli.

Saluti
Nandi
115 messaggi dal 01 novembre 2012
Scusa, ma credo di aver cantato troppo presto vittoria, anche se ora è più performante l'errore che mi è uscito ora è di natura credo diversa:

Errore server nell'applicazione '/'. 
________________________________________
error connecting: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached. 
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere la traccia dello stack. 

Dettagli eccezione: MySql.Data.MySqlClient.MySqlException: error connecting: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

Errore nel codice sorgente: 
Durante l'esecuzione della richiesta Web corrente è stata generata un'eccezione non gestita. Per informazioni sull'origine e la posizione dell'eccezione, vedere la traccia dello stack dell'eccezione riportata di seguito. 

Traccia dello stack: 

[MySqlException (0x80004005): error connecting: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.]
   MySql.Data.MySqlClient.MySqlPool.GetConnection() +303
   MySql.Data.MySqlClient.MySqlConnection.Open() +1614
   GvoWebAutomotive.miaClasse.VerificaLogin(String StrLogin, String StrPwd) in C:\GvOnTheWeb - in Modifica 02_05_2018\GvoWebAutomotive\GvoWebAutomotive\App Codice\miaClasse.vb:62
   GvoWebAutomotive.WebLogin.Button1_Click(Object sender, EventArgs e) in C:\GvOnTheWeb - in Modifica 02_05_2018\GvoWebAutomotive\GvoWebAutomotive\WebLogin.aspx.vb:17
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3691


11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Nando,
il problema è che stai lasciando aperte le connessioni. Quando il numero massimo di connessioni aperte raggiunge una certa soglia, l'applicazione non può più aprirne altre e va in errore dopo un periodo di timeout. Devi usare i blocchi Using proprio come è stato fatto nella funzione VerificaLogin. Il fatto che l'errore si sia verificato lì è solo un caso. Si verifica anche in ogni altra pagina che cerca di aprire la connessione.

ciao,
Moreno

Enjoy learning and just keep making

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.