Avatar billede disco_keld Nybegynder
17. september 2003 - 10:13 Der er 46 kommentarer

Mit login button event redirecter ikke?

Hej med jer..

Nogen der kan gennemskue, hvorfor den ikke redirecter eller udskriver error labelenbeskeden?

Der sker ikke en skid, ren udsagt og den viser ingen fejl.

koden:
--------------------------------------------------------

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

---------------------------------------------------------

Mvh

DK
Avatar billede lauge Nybegynder
17. september 2003 - 10:16 #1
hvad sker der i din Private Sub Page_Load ??
Avatar billede disco_keld Nybegynder
17. september 2003 - 10:20 #2
i min page_load, sker der ingenting.

men i min Application_AuthenticateRequest i global.asax har jeg følgende kode:

-----------------------------------------------------------------------

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

--------------------------------------------------------------------------

Jeg vil gerne give nogle flere points, hvis det kommer til at virke.

Jeg har siddet alt for længe med, uden at kunne finde fejlen.

:-(
Avatar billede odegaard Nybegynder
17. september 2003 - 10:52 #3
Lige et dumt spørgsmål, men nu har du linket selve knappen til funktionen btnLogin_Click ?
Avatar billede disco_keld Nybegynder
17. september 2003 - 11:00 #4
yeps... den er i vinkel
Avatar billede disco_keld Nybegynder
17. september 2003 - 11:02 #5
jeg har prøvet og udskrive, "roles" fra db og den indeholder det den skal.

jeg har også udskrevet returnUrl og den er også i vinkel.

Men det virker ikke... :-(
Avatar billede odegaard Nybegynder
17. september 2003 - 11:04 #6
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).
Avatar billede disco_keld Nybegynder
17. september 2003 - 11:07 #7
lyder som en god idé...

jeg bruger VS.NET 2003, men har aldrig prøvet og debug der.

Har du et link til et sted jeg kan læse om VS.NET debug?
Avatar billede disco_keld Nybegynder
17. september 2003 - 11:10 #8
Den kommer lige nøjagtig her til:

'her til....
If reader.Read() Then


hehe

hvorfor det?
Avatar billede quaser Nybegynder
17. september 2003 - 11:13 #9
Vil anbefale at du slår smartnavigation fra.
Du kan evt. teste om det er det ved at åbne siden i mozilla eller et andet ikke ie baseret browser.
Avatar billede odegaard Nybegynder
17. september 2003 - 11:24 #10
Fordi reader.Read() er tom
Fra SDK'en:
Return Value: true if there are more rows; otherwise, false.
Avatar billede odegaard Nybegynder
17. september 2003 - 11:25 #11
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.
Avatar billede disco_keld Nybegynder
17. september 2003 - 11:26 #12
ja okay...

nu har jeg prøvet og fjerne reader.Read().

Nu for jeg denne fejl, selv om jeg skriver noget i text felterne:

error:

Invalid attempt to read when no data is present.
Avatar billede odegaard Nybegynder
17. september 2003 - 11:26 #13
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).
Avatar billede odegaard Nybegynder
17. september 2003 - 11:27 #14
Det gør ikke noget at du læser fejlbeskederne:
"Invalid attempt to read when no data is present."

Som jeg sagde: Du får ikke noget tilbage fra din database.
Avatar billede disco_keld Nybegynder
17. september 2003 - 11:32 #15
>> odegaaard...

jeg har nu oppe i min page_load smidt den samme kode og binder dataene til et datagrid og det virker fint.

der er forbindelse til db.
Avatar billede quaser Nybegynder
17. september 2003 - 11:51 #16
Hvordan ser din pageload ud?
Avatar billede disco_keld Nybegynder
17. september 2003 - 12:10 #17
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

        Response.Write(reader.GetString(0))

        reader.Close()
Avatar billede disco_keld Nybegynder
17. september 2003 - 12:20 #18
det er her den er gal..

reader.GetString(0)

men hvorfor
Avatar billede quaser Nybegynder
17. september 2003 - 12:24 #19
Øhm, hvad melder den af fejl?

Du skal lave en reader.Read() først.
Læg også mærke til at ved
Response.Write(reader.GetString(0))

Går du udfra at den første kolonne er en string og ikke et int. En ID kolonne er for det meste den første kolonne.
Avatar billede disco_keld Nybegynder
17. september 2003 - 12:28 #20
GetString(0) er fordi jeg kun SELECT'r roles fra Db.

Det er derfor den første og eneste felt jeg kalder. Kan man ikke det?
Avatar billede quaser Nybegynder
17. september 2003 - 12:30 #21
Hmm jeg kiggede lige på dit kodestump, og der skrev du
select *
Avatar billede disco_keld Nybegynder
17. september 2003 - 12:31 #22
hehehe... ja det var en fejl.

den står til roles nu.

ligesom i button eventet.
Avatar billede quaser Nybegynder
17. september 2003 - 12:36 #23
Prøv at skrive login og password ud inden du prøver at finde roles i databasen, for lige at finde ud af om de er korrekte.
Avatar billede disco_keld Nybegynder
17. september 2003 - 13:13 #24
okay
Avatar billede disco_keld Nybegynder
17. september 2003 - 13:34 #25
når jeg udkommentere de linjer her:

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.
Avatar billede odegaard Nybegynder
17. september 2003 - 14:01 #26
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
Avatar billede disco_keld Nybegynder
17. september 2003 - 14:17 #27
>>> odegaard

min SQL:

-----------------------

CREATE PROCEDURE dbo.ValidateUser
(
    @UserName nvarchar(64),
    @Password nvarchar(128)
)
AS

SELECT roles
FROM user_accounts
WHERE username=@UserName AND [password]=@Password
GO

----------------------

og mine sqlcommand parametre ser nu således ud:

.CommandText = "ValidateUser"
                .CommandType = CommandType.StoredProcedure
                .Parameters.Add("@UserName", txtUserName.Text)
                .Parameters.Add("@Password", txtPassword.Text)
                .Connection = cn
                rd = .ExecuteReader()

-------------------

:-(

hvad kan det være?
Avatar billede quaser Nybegynder
17. september 2003 - 14:25 #28
Som skrevet, tidliger, du har tjekket at txtUserName.Text er korrekt?
Avatar billede disco_keld Nybegynder
17. september 2003 - 14:30 #29
>>> quaser

jeg er ved at være træt nu.

Hvordan gør jeg det, udskriver den text værdi fra txtUserName.Text?
Avatar billede quaser Nybegynder
17. september 2003 - 14:32 #30
Ja f.eks.
Avatar billede quaser Nybegynder
17. september 2003 - 14:32 #31
Eller bruger det med debug som odegaard forklarede tidligere og tjekker direkte på variablen...
Avatar billede disco_keld Nybegynder
17. september 2003 - 14:33 #32
100 points til den som, kan hjælpe mig nu.

Her er linket til det site, jeg har fundet tutorialen.

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=433

Den er i C#, så måske jeg har lavet en fejl.
Avatar billede disco_keld Nybegynder
17. september 2003 - 14:33 #33
eller 2.... :-(
Avatar billede odegaard Nybegynder
17. september 2003 - 14:40 #34
I eksemplet erklærer de cmd således:
Dim cmd As SqlCommand = con.CreateCommand()
Det burde dog ikke betyde det store.
Avatar billede odegaard Nybegynder
17. september 2003 - 14:43 #35
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.
Avatar billede disco_keld Nybegynder
17. september 2003 - 14:52 #36
jamen i det test datagrid, som jeg har smidt i page_load, returnere den fint roles hvis SQL ser således ud:

"SELECT roles FROM user_accounts;"

DAMMMMM!!!!!!!

>>> odegaard hvilken betingelse kunne det være?
Avatar billede odegaard Nybegynder
17. september 2003 - 15:06 #37
Den du angiver i din SQL når du søger efter en bruger:
[...]WHERE username='" & txtUserName.Text & "' AND password='" & txtPassword.Text & "'"
Avatar billede disco_keld Nybegynder
17. september 2003 - 15:07 #38
ja.... hvad der?
Avatar billede odegaard Nybegynder
17. september 2003 - 15:16 #39
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?
Avatar billede guidmaster Nybegynder
17. september 2003 - 15:38 #40
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
Avatar billede quaser Nybegynder
17. september 2003 - 15:41 #41
guidmaster >> øhm han skal gå frem til det første resultat jo...
Avatar billede disco_keld Nybegynder
17. september 2003 - 15:45 #42
yep.... jeg bruger 1.1

det er da for fedt det site du har smidt et link på! :-)

Vidste jeg ikke eksisterede!

SMutter hjem af nu og ser om jeg kan løse problemet der.

Ellers poster jeg videre her og på dotnetforum.dk ! ;-)
Avatar billede guidmaster Nybegynder
17. september 2003 - 15:45 #43
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...
Avatar billede quaser Nybegynder
17. september 2003 - 15:50 #44
Øhm ... Ved hans kald vil han modtage mellem 0 og 1 resultat.


If reader.Read() Then
  login
Else
  kan ikke logge ind
End If

Så jo vil da virke fint nok med sådan en funktion.


Btw. vidste ikke at de havde fået lavet en HasRows() det var da dejligt.
Avatar billede odegaard Nybegynder
17. september 2003 - 16:01 #45
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."
Avatar billede odegaard Nybegynder
17. september 2003 - 16:03 #46
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester