AspGerman Wiki

Bearbeiten

Problem

Ich brauche einen geschützten Bereich auf einem Windows-Server der nur für bestimmte Benutzer zugänglich ist. Abwandlungen dieses Themas könnte sein mein Hoster bietet mir nur ein Benutzerkonto an (oder mehrere gegen Bezahlung). Oder ich brauche eine simple Benutzervalidierung ohne einen eigenen Benutzer dahinter.

Bearbeiten

Wie funktioniert es?

Der Gedanke ist simpel und baut nicht auf echten Benutzerkonten auf sondern auf einem "Kennwort" und einer kleinen Kopfrechnerei das den Besuchern einmalig mitgeteilt wird. Das Kennwort wird abgefragt und in einer Application-Variable abgelegt. Einmal auf die Art "angemeldet" kann sich der Benutzer den Rest des Tages austoben. Am nächsten Tag wird eine neues Kennwort aus einem bekannten Bestandteil und einer Minirechnung für den Benutzer neu erzeugt.

Das folgende Beispiel stelle ich hier hauptsächlich dazu rein um Feedback dazu zu erhalten, um zu sehen was in der Praxis funktioniert und was nicht. Ferner ist klar anzumerken, dass das gezeigte Verfahren nicht die ultimative Sicherheit bietet. Das Pseudo-Kennwort wird in einer Application-Variable gespeichert und ist damit als Cookie auf dem Rechner des Benutzers einsehbar.

Nehmen wir mal es gäbe ein Verzeichnis /admin (der Name ist Schall und Rauch, es müsste noch nicht mal ein eigenes Verzeichnis sein) und dort liegen

  • default.asp als Login- und Übersichtsseite
  • include.asp für gemeinsam genutzten Code
  • arbeitsseite1.asp um das Prinzip zu verdeutlichen
  • arbeitsseite2.asp

Die INCLUDE.ASP enthält unter anderem diesen Code. Im wesentlich die Routine CheckPwd, die auf eine ganz primitive Weise auf ein Passwort prüft, das der Benutzer eingeben muss. Hier im Beispiel die Quersumme des aktuallen Tages vermischt mit dem Wort "geh xxx eim" anstelle der xxx. Wie errechnet sich die Quersumme? Einfach alle Bestandteile des Datums einzeln addieren. Also heute ist der 20.06.2006 dann also die Summe aus 2+0+0+6+2+0+0+6 oder die Null gleich weggelassen 2+6+2+6. Folglich das Kennwort "geh16eim". Morgen ist es dann ein anderes Kennwort, damit es nicht ganz so einfach ist, wenn das Kennwort doch mal die Runde macht. Für die eigene Anwendung bitte selbst was besseres ausdenken :-)

<%
Sub CheckPwd ()
  If Application("Pwd") <> "geh" & LCase(Quersumme() & "eim") Then
    Response.Write "<html><head><meta http-equiv=""Content-Language"" content=""de"">" & _
      "<title>Einloggen</title><style>body, input { font-family: Tahoma; font-size: 10pt }</style></head>" & _
      "<body><form method=""POST"" action=""default.asp""><p><b>Dieser Bereich ist mit Kennwort gesichert</b></p>" & _
      "<p>Kennwort eingeben:&nbsp; <input type=""text"" name=""pwd"" size=""20""> " & _
      "<input type=""submit"" value=""ok"" name=""action""></p></form></body><html>"   
    Response.End 
  End If
End Sub
' --- statt <input type=""text"" ... könnte auch <input type=""password"" angebracht sein

Function Quersumme()
  Dim a, b, i, sTemp
  b = Replace(Formatdatetime(now(), 2), ".", "")
  sTemp = 0
  For i = 1 to Len(b)
    sTemp = sTemp + CSng(mid(b, i, 1) * 1)
  Next
  Quersumme = sTemp
End Function
%>

Zum Einbinden in jeder ARBEITSSEITEx.ASP dann die Check-Routine einbaune. Hier mal gleich ein vollständiger Kopf. Die Direktive zum Session-state braucht es nicht unbedingt wenn Sessions serverweit eingeschalten sind. Aber sicher ist sicher, so geht es auch wenn mal ausgeschalten.

<%@ EnableSessionState=True Language=VBScript LCID=1031 %>
<% 	Option Explicit %>

<%
CheckPwd
' weitere Befehle
%>
<html>...

Die DEFAULT.ASP ist im Grunde genauso aufgebaut wie die Arbeitsseite. Einen kleinen Luxus kann man hier einbauen: geht ein User direkt auf eine Arbeitsseite und war noch nicht eingeloggt, dann kommt erst der Login-Dialog und wenn der erfolgreich war geht es direkt zurück zur Arbeitsseite.

<%@ EnableSessionState=True Language=VBScript LCID=1031 %>
<%   Option Explicit %> 

<%
 Dim a
 Response.Expires = -1
 a = Trim(Request.Form("pwd"))
 If a <> "" Then
   Application.Lock
   Application("Pwd") = a
   Application.UnLock
   If Request.ServerVariables("HTTP_REFERER") <> "" Then
     Response.Redirect Request.ServerVariables("HTTP_REFERER")
   Else   
     Response.Redirect "default.asp" 
   End If
 End If   
 CheckPwd
%>

ScrewTurn Wiki version 2.0.33. Some of the icons created by FamFamFam.