webForumDet fria alternativet

Problem med forms authentication

2 svar · 317 visningar · startad av Vimp

VimpMedlem sedan juli 20022 537 inlägg
#1

Hej,

Jag försöker skapa en klass som ska kolla om en användare finns i databasen och ska då bli inloggad (Forms authentication).
Nu är det så att användaren finns i databasen, men det står ändå att han inte gör det :q
Jag får inga felmeddealenden..

Login.vb:

Imports System.Web
Imports System.Text
Imports System.Data
Imports System.Data.OleDb
Imports System.Configuration
Imports CyberZone.Community.Security.SQLInjection
Imports CyberZone.Community.Data.ConnectionString

Namespace Security
    Public Class Login
        Public Shared Function CheckUser(ByVal Username As String, ByVal Password As String) As Boolean

            Dim strUsername As String = SafeSQL(Username)
            Dim strPassword As String = SafeSQL(Password)
            Dim strUserTmp As String

            Dim objConn As OleDbConnection = New OleDbConnection(GetConnectionString("Default"))
            Dim objCmd As OleDbCommand = New OleDbCommand("SELECT TOP 1 [Username], [Rights] FROM [tblUsers] WHERE LCase(Username)='" & LCase(strUsername) & "' AND LCase(Password) = '" & LCase(strPassword) & "'", objConn)
            objConn.Open()
            Dim antal As Integer = objCmd.ExecuteScalar()

            If antal > 0 Then
                Dim objReader As OleDbDataReader = objCmd.ExecuteReader
                strUsername = objReader.GetString(0)
                HttpContext.Current.Session("sRights") = objReader.GetString(1)
                objReader.Close()
                Return True
            Else
                Return False
            End If

            objConn.Close()

        End Function
    End Class
End Namespace

Login.ascx.vb

    Private Sub btSubmit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSubmit.Click
        If CheckUser(tbUsername.Text, tbPassword.Text) Then
            Trace.Warn("CyberZone.Community.Security.Login.CheckUser", "Inloggad")
            FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbAutoLogin.Checked)
        Else
            Trace.Warn("CyberZone.Community.Security.Login.CheckUser", "Ej inloggad")
            With ltMessage
                .Visible = True
                .Text = "Fel användarnamn / lösenord."
            End With
        End If
    End Sub

Varför returnerar CheckUser false?

nikoMedlem sedan juni 20022 599 inlägg
#2

ExecuteScalar returnerar inte antalet poster, utan värdet på första fältet i första posten (vilket iofs borde ge ett fel i det här fallet).

Men varför inte bara köra ExecuteReader med en gång och kolla om den returnerar nåt? Det är ju i vilket fall som helst onödigt att köra samma fråga två gånger.

VimpMedlem sedan juli 20022 537 inlägg
#3

Såg inte att jag inte körde count() i SQL-satsen ;)
Tack för att du upptäckte det :)

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)