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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Formular-basierte Basic Authentication

Geschrieben von: Tomas Rendel
Kategorie: Sicherheit

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 Übertragungsmethode muß POST sein (method="post")
  • Der Name des aufzurufenden Scripts (ACTION="login.asp")
  • Die Namen der Texteingabefelder (txtDirectory, txtUser, txtPassword)

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

ASP-basierte Basic Authentication
On Demand Zugriffsrechte für Web Sites vergeben
Passwörter mit SHA1 absichern
Verwendung von SSL Test-Certificates
Verzeichnissicherheit mit NTFS und IIS Authentifizierung

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.