Hej jag är en gammal asp programmerare som vill lära migg skriva korrekt och snygg c#. Det finns ett mycket bra stöd för detta i asp.net. Föreslår att du kolla på avsnittet "AUTHENTICATION" och framför allt forms authentication. Vart kan jag hitta det avsnittet? Gäller det bara asp.net? Kanske bör säga att jag ville ha hjälp med att ta fram värdet från databasen där i den sista if-satsen... Hej, Okej... Tack för tipsen... Men jag får det fortfarande inte att fungera... Nåt sånt här kanske:Ett inloggnings script...
<kod>
string Username = textBox1.Text;
string Password = textBox2.Text;
if(Username=="" | Password=="")
{
MessageBox.Show("Du måste ange användarnamn och lösenord!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
string SQL = "SELECT * FROM tbKonton WHERE username='"+ Username +"'";
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Databaser+"databas.mdb;Jet OLEDB:Database Password=iop90;Persist Security Info=False";
OleDbConnection con = new OleDbConnection(CONstring);
OleDbCommand dc = new OleDbCommand(SQL, con);
OleDbDataAdapter da = new OleDbDataAdapter(dc);
DataSet ds = new DataSet();
da.Fill(ds, "tbKonton");
DataRowCollection konton = ds.Tables["tbKonton"].Rows;
int i = ds.Tables["tbKonton"].Rows.Count;
if(i==0)
{
MessageBox.Show("Det finns inget konto med det här användarnamnet!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
foreach(DataRow rad in konton)
{
if(Password==?? Vad ska jag skriva för att få columen password från databasen???)
{
MessageBox.Show("Det gick att ansluta!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
MessageBox.Show("Du angav fel lösenord!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Stop);
</kod>
Finns det något bättre sätt att skirva en loggin? Den här är väl säker eller?Sv: Ett inloggnings script...
/MarcusPSv: Ett inloggnings script...
Vh Jakob HäggSv: Ett inloggnings script...
Sv: Ett inloggnings script...
Först lite tankar kring säkerhet. Du gör två stora misstag, tyvärr.
1... du talar om för en ev hackar/cracker att du angett ett användarnamn som inte finns.
2... du talar om för en ev hacker/cracker att du angett ett lösenord som inte finns.
Med andra ord kan en hacker/cracker veta om han hon angett ett giltigt användarnamn och behöver bara
brute forca lösenorden.
Lösning. Om användarnamn och lösen är felaktigt skriv det. Du angav ogitliga inloggningsuppgifter eller liknande. Tala _Aldrig_ om vilka uppgifter/fält som var felaktiga.
Ser ut som du gör en Win Form applikation? Antar då att databasen ligger lokalt på datorn, måste du ha login då? För vem som kan ju titta genom dbn efter användare och logga in precis hur han vill.
Varför har du en login? syftet? Skall flera olika användare kunna logga in på samma klient på samma dator?
I övrigt är koden rätt sunkig, ledsen o säga det så hårt. Det finns mkt du kan justera för att få den smidigare.
Några synpunkter är:
Varför dataset om du bara vill veta om användaren finns?
Varfrö kolla en where efter endast användarnamn i din Select fråga o inte ta med både username och password i din where sats? Det gör att du direkt får ett svar om denna användare finns eller ej.
Ex om du kör med en DataReader så kollar du bara om den har rader har den det fanns en match med användarnamn och lösen.
Om du skall ha en flagga som talar om ifall användaren är inloggad eller ej så kan du köra en update sats istället, där du kör en update på ett InOnline fält eller liknande där användarnamn och lösen matchar. Om användaren finns får du ett affected rows värde tillbaka där 0 betyder att inget hände och allt över noll bevisar att användaren finns.
Det finns fler smidiga sätt för login, allt handlar om vad du o ditt system ställer för krav.
Mvh JohanSv: Ett inloggnings script...
string SQL = "SELECT * FROM tbKonton WHERE username='"+ Username +"' AND password='"+ Password +"'";
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Databaser+"databas.mdb;Jet OLEDB:Database Password=iop90;Persist Security Info=False";
OleDbConnection con = new OleDbConnection(CONstring);
OleDbCommand dc = new OleDbCommand(SQL, con);
int i = dc.ExecuteNonQuery();
if(i==1)
{
MessageBox.Show("Det gick att ansluta!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
MessageBox.Show("Det finns inget konto med det här användarnamnet!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
Vad ska jag skriva istället för ExecuteNonQuery ??? Eller måste jag fylla ett DataSet för att få det att fungera?Sv: Ett inloggnings script...
string SQL = "SELECT * FROM tbKonton WHERE username='"+ Username +"' AND password='"+ Password +"'";
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Databaser+"databas.mdb;Jet OLEDB:Database Password=iop90;Persist Security Info=False";
OleDbConnection con = new OleDbConnection(CONstring);
OleDbCommand dc = new OleDbCommand(SQL, con);
con.Open();
OleDbDataReader myReader= dc.ExecuteReader();
if(myReader.HasRows)
{
MessageBox.Show("Det gick att ansluta!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Det finns inget konto med det här användarnamnet!", "WI: Bokning", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
con.Close();
myReader.Close();
Sen förstår jag inte varför du envisas med att ha return överallt... metoden kommer att returnera när den har gått klart. Använd dig av if satser på ett korrekt sätt så slipper du ha en massa return överallt.
Sen kan du ju fundera på om det är smart att spara lösenorden i klartext i din databas, kanske bättre att hasha dem och när du sedan skickar in ditt lösenord hashat istället. Då är du iallafall säkrare än om du sparar dem i klartext. Är säker på att Johan N har några bra länkar till sådant...