Advanced
Java
Services
|
Authentication |
Ein Client fordert beim Server eine Datei oder ein Verzeichnis an, für die (oder das) eine Authentifizierung
notwendig ist. Für dieses paßwortgeschützte Objekt sendet der Client aber keine Authentifizierung. Mit einem
Browser geschieht dies durch eine einfache GET-Anfrage:
Die erste GET-Anfrage ohne Authentifizierung (kann etwa so aussehen)
GET /protected.html HTTP/1.1
Host: 192.168.69.45
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1
Accept: text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Der Server verweigert den Zugriff auf das Objekt protected.html und sendet stattdessen eine Aufforderung
an den Client, sich zu authentifizieren. Dazu setzt der Server den HTTP response code auf
401 (HTTP UNAUTHORIZED) und versieht den Antwortheader mit einem zusätzlichen Eintrag. Wie alle
Headereinträge ist auch dieser von der Form HeaderName : HeaderValue.
HeaderName ist jetzt das reservierte Wort "WWW-Authenticate", in HeaderValue wird der Algorithmus
angegeben, nach dem der Client ein eingegebenes Paßwort zu verschlüsseln hat. Des weiteren steht in
HeaderValue der Name des geschützten Bereichs. Aus diesem Namen sollte der (befugte) Client erschließen
können, welchen Usernamen und welches Paßwort er einzugeben hat:
Der ResponseHeader, der Authentifizierung verlangt (kann etwa so aussehen)
HTTP/1.1 401 Authorization Required
Date : Sat, 03 Jan 2004 09:16:46 GMT
Server : Apache/1.3.20 (Linux/SuSE) mod_ssl/2.8.4 OpenSSL/0.9.6b PHP/4.3.2 FrontPage/4.0.4.3
X-Powered-By : PHP/4.3.2
Expires : Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified : Sat, 03 Jan 2004 09:16:46 GMT
WWW-Authenticate : Basic realm="download-area"
Keep-Alive : timeout=15, max=100
Connection : Keep-Alive
Transfer-Encoding : chunked
Content-Type : text/html
Im obigen Beispiel wird "BASIC" als Verschlüsselungsmethode vom Server gewünscht.
Die Software des Client (in der Regel der Browser) reagiert mit der Darstellung eines modalen Fensters,
in dem der Client nun einen Benutzernamen und ein Paßwort eingeben kann. Nach der Eingabe verschlüsselt
der Browser das Paßwort gemäß der Vorgabe des Servers und schickt erneut eine GET-Anfrage, diesmal aber
mit der verschlüsselten Eingabe des Client.
Die zweite GET-Anfrage mit Authentifizierung (kann etwa so aussehen)
GET /protected.html HTTP/1.1
Host: 192.168.69.45
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1
Accept: video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Authorization: Basic c3RyYXViOm1heA==
Die Auswertung der zweiten GET-Anfrage durch den Server
Der Server entschlüsselt nun das Paßwort. Ist es korrekt, so wird er die gewünschte Datei liefern, ist
es falsch, so verschickt er erneut einen Responseheader, der Authentifizierung verlangt. Wie oft dieses
call und response Schema durchlaufen wird, hängt sowohl vom Browser wie auch vom Server ab. Zusammen mit
dem Header, der Authentifizierung verlangt, wird immer auch ein Body verschickt, der im Falle des
Verwerfens der Anfrage eine kurze Erklärung enthält.
Der vom Server mit der Aufforderung zur Authentifizierung verschickte Body (kann etwa so aussehen)
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>401 Authorization Required</title>
</head>
<body>
<h1>Authorization Required</h1>
This server could not verify that you are authorized to access the document
requested. Either you supplied the wrong credentials (e.g., bad password),
or your browser doesn't understand how to supply the credentials required.
</body>
</html>
Mißlingt die Authentifizierung, so wird vom Browser dieser body folgendermaßen dargestellt:
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.
Im folgenden werden die einfache BASIC und die sehr viel raffiniertere DIGEST Verschlüsselung für Servlets beschrieben.