Protected Sub btnLogin_Click(ByVal senders As Object, ByVal e As EventArgs) Handles btnLogin.Click If Page.IsValid Then
FormsAuthentication.Initialize()
Dim con As SqlConnection = New SqlConnection("Server=(local); Database=Security_DB; Integrated Security=SSPI; Connection Timeout=60;") Dim cmd As New SqlCommand Dim reader As SqlDataReader
con.Open() With cmd .CommandText = "SELECT roles FROM user_accounts WHERE username=@username AND password=@password" .CommandType = CommandType.Text .Parameters.Add("@username", SqlDbType.NVarChar, 64).Value = txtUserName.Text .Parameters.Add("@password", SqlDbType.NVarChar, 128).Value = txtPassword.Text .Connection = con reader = .ExecuteReader End With
Try If reader.Read() Then
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, txtUserName.Text, DateTime.Now, DateTime.Now.AddMinutes(2), True, reader.GetString(0), FormsAuthentication.FormsCookiePath)
Dim hash As String = FormsAuthentication.Encrypt(ticket) Dim cookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, hash)
Response.Cookies.Add(cookie)
Dim returnUrl As String = Request.QueryString("ReturnUrl")
If (returnUrl = "") Then returnUrl = "/" '// Don't call FormsAuthentication.RedirectFromLoginPage since it could Response.Redirect(returnUrl) Else lblErrorLabel.Text = "Fejl!" lblErrorLabel.Visible = True End If End If
reader.Close() con.Close() Catch ex As Exception Throw ex End Try End If End Sub
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) If Not HttpContext.Current.User Is Nothing Then If HttpContext.Current.User.Identity.IsAuthenticated Then If (TypeOf HttpContext.Current.User.Identity Is FormsIdentity) Then Dim id As FormsIdentity = CType(HttpContext.Current.User.Identity, FormsIdentity) Dim ticket As FormsAuthenticationTicket = id.Ticket
'// Get the stored user-data, in this case, our roles Dim userData As String = ticket.UserData Dim roles As String() = userData.Split(",") HttpContext.Current.User = New GenericPrincipal(id, roles) End If End If End If End Sub
Prøv at smide en Response.Write("et eller andet tekst") ind i første linje i funktionen, og se om den i det hele taget bliver kaldt. I så fald, prøv at flytte den ned, indtil du finder stedet hvor den springer over (Hvis du bruger VS.NET kan du selvfølge også debugge dig ned igennem).
Mht debug, så klik ude til venstre ud for en linje. Så skulle linjen gerne blive rød, hvilket betyder et breakpoint. Når du så trykker på "play"-knappen øverst, så vises siden i en browser, og stopper når den når til dit breakpoint. Så kan du se hvad variablerne indeholder. Ved at trykke play igen, kan du hoppe frem til næste breakpoint osv.
variablernes værdier ser du typisk ved at holde musen over variabelnavnet (ved simple datatyper), eller tilføje en watch (højreklik på et variablnavn i koden og vælg quickwatch eller add watch).
Dim con As SqlConnection = New SqlConnection("Server=(local); Database=Security_DB; Integrated Security=SSPI; Connection Timeout=60;") Dim cmd As New SqlCommand Dim reader As SqlDataReader
con.Open() With cmd .CommandText = "SELECT * FROM user_accounts;" .Connection = con reader = .ExecuteReader() End With
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, txtUserName.Text, DateTime.Now, DateTime.Now.AddMinutes(2), True, reader.GetString(0), FormsAuthentication.FormsCookiePath)
Dim hash As String = FormsAuthentication.Encrypt(ticket) Dim cookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, hash)
Response.Cookies.Add(cookie)
Så hopper den i det mindste ned til error labelen.
Har du stadig fjernet reader.Read() ? For så er det jo klart at den hopper derhen hvor den gør. Som jeg ser det så ER dit problem databaseopslags-relateret. Jeg vil vædde med at du sørger efter noget andet end du tror du gør. Og det har helt sikkert noget at gøre med .Parameters.Add("@username", SqlDbType.NVarChar, 64).Value = txtUserName.Text .Parameters.Add("@password", SqlDbType.NVarChar, 128).Value = txtPassword.Text
Der burde ihvertfald ringe en klokke, når sætningen: "SELECT * FROM user_accounts;" fint returnerer alle user_accounts, og "SELECT roles FROM user_accounts WHERE username='" & txtUserName.Text & "' AND password='" & txtPassword.Text & "'" ikke gør. Med andre ord er der en betingelse der nok ikke er opfyldt.
ja det er jo nok der det går galt. Hvis den ikke finder den angivne bruger med det angivne password, så går den galt. Med andre ord, som quaser siger: Indeholder txtUserName.Text og txtPassword.Text det du tror de indeholder?
Sig mig er problemet ikke at du kun får et resultat ud af din sp. og derefter siger "If reader.Read() Then". Det kan du ikke da datareaderen derefter går et resultat frem i resultatet. Men du er heldig - du bruger 1.1 og her har de nu fået lavet en SqlDataReader.HasRows() som tjekker på om der er noget i din datareader. Se evt. http://weblogs.dotnetforum.dk/guidmaster/posts/209.aspx
Han laver vel If reader.read for at finde ud af om der er nogle resultater - dette kan desværre ikke lade sig gøre på denne måde da readeren så springer videre til næste resultat. Alt i alt betyder det at man mister det første resultat...
Jeg er nu enig med quaser. Iøvrigt forsøgte disco_keld helt at fjerne reader.Read() hvilket resulterede i fejlen "Invalid attempt to read when no data is present."
Iøvrigt normal procedure for at løbe en datareader igennem er med While reader.Read() [...] End While
Dvs. reader.Read() kaldes til at starte med. Returnerer reader.Read() false hoppes der ud af løkken. Er den helt tom køres løkken slet ikke.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.