Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Formular-basierte Basic Authentication

Geschrieben von: Tomas Rendel
Kategorie: Sicherheit

This printed page brought to you by AlphaSierraPapa

Basic Authentication ist an und für sich eine sehr praktische und einfache Möglichkeit ganze Verzeichnisse (und deren Inhalt - unabhängig welchen Dateiformats) zu schützen. Die im nachfolgenden gezeigte Methode soll nun zwei entscheidende Nachteile von Basic Authentication beheben: die unschöne Login-Dialogbox und die Verzeichnisauswahl via URL.

Unser Login Formular

Als erstes benötigen wir ein Formular, in das durch den Benutzer die zum Login benötigten Parameter eingegeben und übertragen werden können. Wichtig für die einwandfreie Zusammenarbeit mit dem im nächsten Abschnitt gezeigten ASP Script (login.asp) sind folgende Punkte:

Die Gestaltung des Formulars ist selbstverständlich völlig frei. Hier eben ein simples Formular, das man leicht graphisch anpassen kann (form.asp):

<html>
<head>
<title></title>
</head>
<body bgcolor="#FFFFFF">
<form name="forLogin" method="post" action="login.asp">
  <table width="180" border="0" cellspacing="0" cellpadding="0">
    <tr> 
      <td align="left">Directory:</td>
      <td align="right"> 
        <input type="text" name="txtDirectory" size="12" maxlength="20">
      </td>
    </tr>
    <tr> 
      <td align="left">User:</td>
      <td align="right"> 
        <input type="text" name="txtUser" size="12" maxlength="20">
      </td>
    </tr>
    <tr> 
      <td align="left">Password:</td>
      <td align="right"> 
        <input type="text" name="txtPassword" size="12" maxlength="20">
      </td>
    </tr>
    <tr> 
      <td align="left">&nbsp;</td>
      <td align="right"> 
        <input type="submit" value="Login">
      </td>
    </tr>
  </table>
</form>
</body>
</html>

Und so sieht dann unser Loginformular im Browserfenster aus:

Unser Login Script

Beginnen wir mit einem Blick auf den Sourcecode am Anfang des Scripts, der uns einiges an späteren Kopfschmerzen ersparen wird:

<%@Language="VBScript" EnableSessionState="False"%>
<%
Option Explicit
Response.Buffer = True
Response.AddHeader "cache-control", "no-store"
Response.AddHeader "pragma", "no-cache"
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0

In der ersten Zeile legen wir die verwendete Scriptsprache fest, und verhindern, daß für unser Script unnötige Sessions auf dem Server erzeugt werden. Durch Option Explicit wird die ausschließliche Verwendung der durch uns explizit deklarierten Variablen erzwungen. Mit Response.Buffer und den erweiterten Headern ersparen wir uns Caching-Probleme bei Browser und Proxy.

Nun werden die drei benötigten Variablen deklariert , und ihnen mittels Request.Form die mit dem Formular (form.asp) übergebenen Werte zugewiesen:

Dim strUser, strPassword, strDirectory

strUser = Request.Form("txtUser")
strPassword = Request.Form("txtPassword")
strDirectory = Request.Form("txtDirectory")

Im Nachfolgenden wird die Verbindung zur Datenbank aufgebaut und ein Recordset erzeugt. Gesucht wird hier mittels einer SQL-Abfrage nach einer Zeile in der Tabelle ("YourTable"), die exakt die vom Formular (form.asp) übergebenen drei Parameter in den entsprechenden Spalten aufweist:

Dim rsUser
Set rsUser = Server.CreateObject("ADODB.Recordset")
    rsUser.ActiveConnection = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & _
        Server.MapPath("YourDataBase.mdb") & "; UID=; PWD=YourPassword"
    rsUser.Source = "SELECT COUNT (*) FROM YourTable WHERE Directory = '" & (strDirectory) & _
        "' AND User = '" & (strUser) & "' AND Password = '" & (strPassword) & "'"
    rsUser.CursorType = 0 'adOpenForwardOnly
    rsUser.CursorLocation = 2 'adUseServer
    rsUser.LockType = 3 'adLockOptimistic
    rsUser.Open

Wenn die Abfrage eine entsprechend gültige Zeile als Ergebnis hat, setzt das Script mit dem nächsten Block fort :

If rsUser.Fields(0).Value = 1 Then

Soweit war das nun alles nichts Neues, der kleine "Kniff", mit dem wir es schaffen, dem Browser die vom User eingegeben Parameter (Verzeichnis, Benutzer, Kennwort) zu übergeben, folgt in diesem Teil des Scripts. Hier wird dem Browser als Antwort eine minimale HTML-Datei geschickt, deren einzige Aufgabe darin besteht, unmittelbar folgende URL aufzurufen: http://User:Password@YourDomain.com/Directory

Auf diese Weise werden alle benötigten Daten an den Server übergeben, und die lästige und unschöne Paßwort Dialogbox unterdrückt:

Response.Write "<html>"
Response.Write "<head>"
Response.Write "<title></title>"
Response.Write "<meta http-equiv=""refresh"" content=""0; url=http://" & _
    (strUser) & ":" & (strPassword) & "@YourDomain.com/" & _
    (strDirectory) & """" & ">"
Response.Write "</head>"
Response.Write "<body>"
Response.Write "</body>"
Response.Write "</html>"

Sollten die vom Nutzer eingegebenen Daten (Verzeichnis, Benutzer, Kennwort) keine Entsprechung in der Datenbank gefunden haben, wird er hier im Beispiel einfach wieder mit Response.Redirect("form.asp") auf das Login_Formular zurückgeschickt:

Else 
    Response.Redirect("form.asp")
End If

Zuletzt wird das Recordset wieder geschlossen und auch der Speicherbereich geleert:

rsUser.Close
Set rsUser = Nothing
%>

Schlußbemerkung

Die heute vorgestellte Methode hat einen Nachteil: Alle Benutzer müssen zusätzlich in einer Datenbank (oder Flatfile) geführt werden. Allerdings, einen großen Vorteil hat sie auch: Nicht alle .asp-Dateien müssen im Gegensatz zu einer rein ASP-basierten Authentication Lösung mit einem zusätzlichen Include versehen werden, es werden alle Dateitypen im Verzeichnis geschützt, es werden keine Servererweiterungen benötigt, die meist Geld kosten und bei gemietetem Webspace ohnehin nicht installiert sind.

Es gibt auch einige Erweiterungsmöglichkeiten, so kann zB die Sicherheit durch Verwendung eines SSL geschützten Bereiches deutlich gesteigert werden. Zudem könnte man fehlerhafte Loginversuche mit Angabe von (Verzeichnis, Benutzer, Kennwort, IP-Adresse, Datum, Uhrzeit) erfassen.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010608.zip

Verwandte Artikel

ASP-basierte Basic Authentication
http:/www.aspheute.com/artikel/20010521.htm
On Demand Zugriffsrechte für Web Sites vergeben
http:/www.aspheute.com/artikel/20011207.htm
Passwörter mit SHA1 absichern
http:/www.aspheute.com/artikel/20010330.htm
Verwendung von SSL Test-Certificates
http:/www.aspheute.com/artikel/20000630.htm
Verzeichnissicherheit mit NTFS und IIS Authentifizierung
http:/www.aspheute.com/artikel/20001109.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.