Visar inlägg med etikett Login. Visa alla inlägg
Visar inlägg med etikett Login. Visa alla inlägg

tisdag 26 januari 2010

Login(2)

Med den nuvarande versionen av Login.aspx går det att logga in i systemet nu, men systemet vet inte vem besökaren är. Ganska meningslöst med andra ord. Men det går att ändra på.

Men alla besökare får automatisk en identitet, en cookie, som systemet kan läsa. En cookie består av en text och några andra uppgifter. Texten kan se ut så här: mjtnde550hugrt2au4ycuk25.

Det första programmet bör göra, dvs i Page_Load, är att läsa cookien och sedan söka i databasen om det finns någon användare med denna cookie. Cookien finns i objektet HttpCookie som måste deklareras med satsen Dim cookie As HttpCookie. Denna deklaration görs lämpligen utanför Page_Load så att objektets innehåll är tillgängligt båda i Page_Load och proceduren Login1_Click som hanterar klick på loginformuläret.

I databasen finns cookien i fältet kaka som lagrar en sträng om 50 tecken. Databasen ska returnera användarens interna id och användarnamnet så SQL-satsen blir
SELECT id, kaka, username FROM [User] WHERE kaka='" & cookie.Value & "'".

Förbindelsen med databasen skapas med
Dim conn As SqlConnection
Dim connectionstring As String = ConfigurationManager.ConnectionStrings("System91").ConnectionString
conn = New SqlConnection(connectionstring)
Dim comm As SqlCommand
comm = New SqlCommand(sql, conn)

Själva läsningen görs inom Try... Catch. Eftersom flera uppgifter hämtas från databasen sker det med ExecuteReader().

Den centrala koden som utförs innan loginformuläret visas är följande

Dim cookie As HttpCookie
Dim Username As String = ""
Dim sql As String
Dim cookie As HttpCookie

If Not IsPostBack Then
cookie = Request.Cookies.Get("System9")
If cookie Is Nothing Then
Master.DisplayDataFromPage("")
else
sql = "SELECT id, kaka, username FROM [User] WHERE kaka='" & cookie.Value & "'"
Dim conn As SqlConnection
Dim connectionstring As String = ConfigurationManager.ConnectionStrings("System91").ConnectionString
conn = New SqlConnection(connectionstring)
Dim comm As SqlCommand
comm = New SqlCommand(sql, conn)
Try
conn.Open()
Dim reader As SqlDataReader = comm.ExecuteReader()
If reader.Read() Then
Userid = reader.Item("id")
Username = reader.Item("Username")
Master.DisplayDataFromPage(Username)
Else
Master.DisplayDataFromPage("Inte inloggad")
End If
Catch ex As SqlException
Message.Text += " Databasfel. " & ex.Number & ": " & ex.Message
Finally
conn.Close()
End Try
End If
End If

IsPostBack-variabeln informerar om användaren beställer samma sida igen. Här innebär kontrollen att Page_Load inte utförs igen när användaren klicka på loginformulärets knapp.
Med Master.DisplayDataFromPage uppdateras fält i MasterPage.DisplayDataFromPage är en procedure i MasterPage.vb som innehåller de satser som behövs för att uppdatera dessa fält. I detta fall ser proceduren ut så här:
Public Sub DisplayDataFromPage(ByVal message As String)
HeadUserName.Text = message
End Sub

Så har programmet utvecklats lite till. I nästa avsnitt tillkommer koden som tar hand om själva inloggningen och uppdaterar databasen med cookien.


torsdag 21 januari 2010

Login (1)

När väl registreringen är på plats ska det bli möjligt att logga in. Hur görs enklast möjliga inloggning? För det krävs ett formulär med fälten användarnamn och lösenord.

<h1>Logga in</h1>
<asp:Label ID="Message" runat="server" Text="Meddelande" ForeColor="#FF3300"></asp:Label>
<p>Användarnamn<br /><asp:TextBox ID="UserName" runat="server"></asp:TextBox></p>
<p>Lösenord<br /><asp:TextBox ID="Password" runat="server"></asp:TextBox></p>
<asp:Button ID="Login1" runat="server" Text="Logga in" />


Vid klick på "logga in" kollas uppgifterna mot databasen.

Protected Sub Login1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Login1.Click
Dim sql As String
Dim Userid As Int32
Dim conn As SqlConnection
Dim connectionstring As String = ConfigurationManager.ConnectionStrings("System91").ConnectionString
conn = New SqlConnection(connectionstring)
Dim comm As SqlCommand
Message.Text = ""
sql = "SELECT id, username, password FROM [User] WHERE username='" & UserName.Text & "' and password='" & Password.Text & "'"
comm = New SqlCommand(sql, conn)
Try
conn.Open()
Userid = comm.ExecuteScalar()
If Userid = 0 Then
Message.Text += " Du är inte inloggad. Om du inte är registrerad kan du göra det <a href='Userregistration.aspx'>här</a>"
Else
Message.Text += " Du är inloggad. ."
End If
Catch ex As SqlException
Message.Text += " Databasfel. " & ex.Number & ": " & ex.Message ', ex.Gettype.ToString
Message.Text += " Du är inte inloggad. "
Finally
conn.Close()
End Try
End Sub

Sedan är användaren inloggad, men för hur länge? Det framgår av Microsofts dokumentation av Session. En enklare beskrivning finns på utmärkta www.w3schools.com sida om ASP Sessions. W3schools (inte Microsoft!) ger svaret: standardvärdet är 20 minuter om annat inte bestämts av systemet.

Så nu fungerar alltså inloggningen, men det är ganska värdelös för användaren kommer inte vidare. Hur bör loginfunktionen vidareutvecklas?
- Logout
- Användarvillkor
- Ingen automatisk utloggning
- Uppdatera sidhuvudet
- Gå till en ny sida

Utan dessa tillägg är det inte meningsfullt att publicera login.aspx på www.server42.se