Dag 10 opgave 4

Opgavens ordlyd er:
"Opgave 4 DB anvendelse
Fortsættelse af opgave 1.Se opgavebeskrivelsen ved at følge dette link
Udvid opgave 1, så navne og password ligger i en Access-database.
Opret databasen i Access og indsæt et par navne.
Du skal læse databasen som i en WindowsApplikation, dvs. en OleDbConnection og en OleDbCommand er tilstrækkeligt.

Udvid evt. opgaven så der er en side, hvor man kan tilmelde sig med navn; så oprettes et mere eller mindre tilfældigt password som vises til brugeren.
Det ville være ekstra fint at mail’e passwordet til en e-mail-adresse som brugeren har oplyst."


Billede af webapplikationen med login

Koden er at finde nederst på denne side

Gå direkte til koden opgave 4 login.aspx.cs
Her kan du også downloade koden som .zip-fil.


Gennemgang af opgaveløsningen:

Denne løsning følger stort set den stillede opgave.
Mit problem med anvendelse af autonumber i access database til generering af fortløbende id'er er stadig ikke løst. Indtil videre har jeg fået oplyst fra underviser, at det ikke er muligt at indsætte i MS Access tabel uden samtidig at angive id-nummer.

Jeg bibeholder derfor min løsning, hvor brugerid laves ved brug af tilfældigt tal fra min codebehind-fil.
Jeg er udemærket klar over, at anvendelse af Random() er en stakket frist, men p.t. kan jeg leve med det.
Det tilfældige tal genanvender jeg så, når programmet skal autogenerere et password til den nye bruger.

For såvidt angår den lille bemærkning i opgaven om "ekstra fint at mail'e passwordet til en e-mail-adresse som brugeren har oplyst": Sådan noget smider man ikke i hovedet på mig, uden at jeg absolut må prøve kræfter.
Jeg vandt ikke styrkeprøven i første omgang.
Efter at have snakket med en af underviserne om vejledningen på denne blog http://blog.vanslaars.com/ forstod jeg, at det ikke handlede om konfiguration af "virtuel-standard-smtp-server" i IIS-manager (som var mit første bud), men derimod manglede jeg at oplyse om min internetudbyders smtp-mailadresse.
Mit kundenummer og kodeord får du ikke. Derfor vælger jeg at lade være med at ændre i koden længere nede på denne side, og viser i stedet lige her, hvordan det skal kodes:

SmtpClient client = new SmtpClient("smtp.mail.dk"); //tdc's udgående mailserver
 
MailAddress from = new MailAddress(afsenderEmail);
MailAddress to = new MailAddress(modtagerEmail); 
MailMessage message = new MailMessage(from, to);
message.Body = string.Format("Hej {0}! Tak for din tilmelding. Dit kodeord er {1} 
og du kan allerede nu logge dig ind.", brugernavn, kodeord);
message.Subject = "Tilmelding til mitsite";
 
NetworkCredential mailLogin = new NetworkCredential("kundenummer", "kodeord");
client.Credentials = mailLogin;
 
try
{
client.Send(message);
}
catch (Exception error)
{
Label1.Text = error.Message;
}
// Clean up.
message.Dispose();


Følgende kode (som er i kildekoden længere nede på denne side) kan trygt udelades:
client.PickupDirectoryLocation = @"C:\Inetpub\mailroot";

client.Port = 25;
client.Host = "localhost";

message.BodyEncoding = System.Text.Encoding.UTF8;
message.SubjectEncoding = System.Text.Encoding.UTF8;



Som i opgave 1 er koden til pg1.apsx og pg2.apsx samt deres codefiles/codebehind-filer kun at finde i zip-filen til download.



Databasen

Selve databasen hedder users, og tabellen hedder brugere.
Den består af 6 felter:
brugerID, brugerNavn, kodeOrd, oprettetDato, ændretDato og emailAdresse.
Som udgangspunkt er oprettetDato og ændretDato den samme. ændretDato skal afspejle, hvornår brugerens oplysninger sidst er blevet rettet. Her er det kun brugerID og oprettetDato som ikke kan ændres (havde jeg tænkt mig).
Det skal dog ikke anvendes i opgaveløsningen, og jeg kunne derfor sagtens have udeladt feltet ændretDato.

I forhold til "Du skal læse databasen som i en WindowsApplikation, dvs. en OleDbConnection og en OleDbCommand er tilstrækkeligt" må jeg indrømme, at jeg ikke helt kunne styre det uden at anvende en datareader. Jeg VED at jeg burde kunne gøre det i samme stil som med php-login'et, ved simpelthen at tjekke på, om der blev fundet præcis 1 række i database-tabellen, hvor brugernavn og kodeord var det samme som det indtastede. Jeg havde ikke tålmodighed til at få executeScalar() til at virke - den burde netop fortælle tallet for hvormange rækker der er berørt. Men min iver efter at løse opgaven var størrere end min interesse i lige at forstå dette.



Vi bringer en advarsel

I forhold til login-delen, så er den ikke sikret i forhold til logout (tryk på linkbutton) hvis dette efterfølges af tryk på tilbageknappen. Her kan brugeren nemlig komme til at se siderne igen. Dette kigger jeg på en anden gang. Mener, at det er min session, der ikke bliver lukket ordentligt, og min redirect, der ikke tjekker på "origin", når der er tale om tilbageknappen.



Henriette Rømer Dreier - 13. april 2006







Download den samlede kode som .zip-fil



Indhold af login.aspx.cs

Indhold af login asp.net server page

Valid CSS!

Valid XHTML 1.0!