Mitt första inlägg här på forumet. Jag har lite problem med hur jag ska kontrollera att dom som loggar in finns med i min databas med användare. Skulle det fungera att använda sig av ett dataset på följande sätt, för att sedan loop igenom den på något sätt och kontrollera användarnamn mot lösenord?
Sub myConn()
Dim myConnection As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\inetpub\wwwroot\inloggning\db\Biluthyrning.mdb")
Dim myCommand As New OleDbDataAdapter("Select * from kunder", myConnection)
Dim ds As DataSet = New DataSet
myCommand.Fill(ds, "kunder")
dg2.DataSource = ds
dg2.DataMember = "kunder"
dg2.DataBind()
myConnection.Close()
End Sub
När datasettet är fyllt använder jag mig av följande för att anropa databasen och fylla det.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim SQL As String
SQL = "SELECT * FROM Kunder WHERE (personnr = '" & namn.Text & "' AND lösen = '" & losen.Text & "');"
ExecuteSql(SQL)
Label1.Text = SQL
End Sub
Sist av allt kommer funktionen som ska använda sig av SQL-satsen.
Sub ExecuteSql(ByVal SQLString As String)
Dim myConnection As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\inetpub\wwwroot\inloggning\db\Biluthyrning.mdb")
Dim myCommand As New OleDbCommand(SQLString, myConnection)
Try
myCommand.Connection.Open()
myCommand.ExecuteNonQuery()
Catch ex As Exception
Label1.Text = ex.Message
End Try
myConnection.Close()
End Sub
Jag vill alltså använda mitt fyllda dataset för att kontrollera deras uppgifter. Jag vet att det knappast kan kallas säkert... Har ni något annat tips hur jag ska gå till väga så tas de gärna emot.
Edit:
Nu har jag lyckats få den att visa saker ur databasen beroende på användarnamn och lösen, men jag kan fortfarande inte lyckas logga in användaren. Jag vet inte hur jag ska göra för att loopa igenom min användarlista i databasen (som nu ligger i ett dataset) och beroende på om dom stämmer släppa vidare personen till nästa sida.
PDahlenMedlem sedan apr. 2004778 inlägg Min första tanke är: Släng allt och börja om!
1. För att kolla en användares uppgifter mot databasen skickar du in användarnamn och lösen som parametrar i en sql-fråga. Sql-frågan kollar om det finns en användare med de uppgifterna och om det gör det kan du få ut alla uppgifterna.
2. Databasresultatet tar du emot i en DataReader. Om Readern är tom fanns det ingen användare = Fel inloggning.
3. "Jag vet att det knappast kan kallas säkert"
Att det är en dålig lösning att använda ett fyllt dataset för att kontrollera uppgifterna har inget med säkerhet att göra utan prestanda.
renholmMedlem sedan apr. 20012 266 inlägg Det som spelar in på säkerheten är t.ex antal inloggningsförsök innan ett konto blir låst eller hur du idenfierar användaren mellan olika sidor.
gregganMedlem sedan jan. 2004678 inlägg Välkommen till WF! =D
kör som PDahlen säger.
kör samma sqlsats men sedan kör du en read på det hela med en datareader. om lösenord och namn är rätt så kommer den att läsa av något och då loggas man in.
såhär skrev renholm till mig en gång i tiden för att hjälpa mig med samma sak.
renholm skrev:
if (minreader.Read())
// weee, användaren finns i databasen
else
// användaren fanns inte eller lösenordet är fel
clownMedlem sedan juni 2000126 inlägg Vet inte om du vet om det, men asp.net har ju inbyggda möjligheter att sköta en lösenords skyddad site.
Kolla här:
http://www.15seconds.com/issue/020305.htm
Och om du vill ha mer säkerhet så titta på fortsättningen:
http://www.15seconds.com/issue/020305.htm
Där är lösenordet "hashat" ;-) och lagt i en xml fil. Kanske kan ändras till databas.
clownMedlem sedan juni 2000126 inlägg Hej igen,
hittade en artikel om att ha hashade lösenord i en databas istället:
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=85
gregganMedlem sedan jan. 2004678 inlägg när vi ändå är inne på det.
clown: är det någon stor skillad på hur seg servern blir beroende på om man använder forms authentiation (stavning?) jämfört med sessions? sessions lär väl dra ner ganska mycket på servern.. eller? om man kör med formauthetiation så borde ju det inte ta speciellt mycket prestanda från servern... stämmer det?
Hej igen och tack för tipsen. Jag har nu suttit och pillat med det här litegrann och lyckas nu åtminstone få min applikation att skriva ut info med hjälp av DataReader. Däremot kan jag inte klura ut hur jag ska lyckas få den att kolla av mot databasen om uppgifterna stämmer.
Det här är den kod jag för tillfället experimenterar med.
<script runat="server">
sub Login(obj as object, e as eventargs)
dim intID as integer = 0
Dim myConnection As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\inetpub\wwwroot\inloggning\db\Biluthyrning.mdb")
dim myCommand as OleDbCommand = new OleDbCommand("select * FROM Kunder Where Personnr = '" & tbUserName.Text & "' AND Lösen = '" & tbPassword.Text & "'", myConnection)
dim myReader as OleDbDataReader
try
myCommand.Connection.Open()
myReader = myCommand.ExecuteReader
do while myReader.Read
intID = myReader.GetInt32(0).ToString
loop
catch ex as OleDbException
lblMessage.Text = ex.Message
finally
myReader.Close
myCommand.Connection.Close()
end try
if intID <> 0 then
session("inloggad")="ja"
session("personnr")=tbUserName.text
lblMessage.Text = "Lyckad inloggning <br>"
response.redirect("kund.aspx")
else
lblMessage.Text = "Misslyckad inloggning <br>"
end if
end sub
</script>
Här tar det stopp för mig. Hur jag än försöker och hur jag än söker information i böcker eller på nätet lyckas jag inte förstå hur det ska gå till att kolla av om det är rätt användare. Som det är nu blir det "Misslyckad inloggning" oavsett vad jag skriver i inloggningsrutorna...
PDahlenMedlem sedan apr. 2004778 inlägg Det du gör är att du loopar igenom din Reader, vilket bara ska ha ett resultat om inloggning funkat och sen kollar du vad du fick för intID.
Istället:
myCommand.Connection.Open()
myReader = myCommand.ExecuteReader
If myReader.Read
session("inloggad")="ja"
session("personnr")=tbUserName.text
lblMessage.Text = "Lyckad inloggning <br>"
response.redirect("kund.aspx")
Else
lblMessage.Text = "Misslyckad inloggning <br>"
End If
Sen tycker jag att du kollar in möjligheten med Forms Authentication istället så slipper du lägga sessionsvariabler och kan lägga alla "säkra" sidor i en skyddad mapp.
Tack så mycket för hjälpen, nu fungerar det strålande. :)
Det där med forms authentication ska jag titta upp inför nästa projekt. Det är nämligen lite bråttom att få klart just det här projektet.
Men återigen, tack så mycket.
clownMedlem sedan juni 2000126 inlägg greggan: Har tyvärr ingen kunskap om prestanda när det gäller Forms Authentication vs Sessions.
Tror faktiskt att Forms Authentications lägger en kaka hos användaren för att spara de användar specifika variablerna, precis som sessions oxå gör.
GladhMedlem sedan maj 20012 812 inlägg
clown: är det någon stor skillad på hur seg servern blir beroende på om man använder forms authentiation (stavning?) jämfört med sessions? sessions lär väl dra ner ganska mycket på servern.. eller? om man kör med formauthetiation så borde ju det inte ta speciellt mycket prestanda från servern... stämmer det?
Allt är relativt, visst så tas det prestanda när man använder sessions istället för att lagra det i en cookies. Men i förhållande till att läsa data från en databas så är det näst intill försumbar prestandaförlust du får med sessioner.
Det finns som sagt bättre områden att hämta prestandavinster på än att skippa sessioner. Och de fyller en viktigt funktion i mer avancerade websiter.
- M
fredrikMedlem sedan dec. 19991 072 inlägg Glöm inte att skydda din inloggning från SQL-injection heller. Jag ser att du använder en sträng för att skapa din SQL-fråga.
Använd istället en parameteriserad fråga för att skydda dig.
Mer om SQL-Injection kan du läsa här:
http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a