Authentifizierung mithilfe eines Skripts
In diesem Abschnitt wird veranschaulicht, wie Sie ein Skript schreiben, das das WinHttpRequest-Objekt verwendet, um auf Daten von einem Server zu zugreifen, für den eine HTTP-Authentifizierung erforderlich ist.
- Voraussetzungen und Anforderungen
- Zugreifen auf eine Website mit Authentifizierung
- Überprüfen der Statuscodes
- Zugehörige Themen
Voraussetzungen und Anforderungen
Zusätzlich zu den Kenntnissen über Microsoft JScript erfordert dieses Beispiel Folgendes:
- Die aktuelle Version des Microsoft Windows Software Development Kit (SDK).
- Das Proxykonfigurationstool zum Einrichten der Proxyeinstellungen für Microsoft Windows HTTP Services (WinHTTP), wenn Ihre Verbindung mit dem Internet über einen Proxyserver hergestellt wird. Weitere Proxycfg.exe finden Sie unterProxycfg.exe Proxykonfigurationstool.
- Vertrautheit mit Netzwerkterminologie und -konzepten.
Zugreifen auf eine Website mit Authentifizierung
Gehen Sie wie folgt vor, um ein Skript zu erstellen, das die Authentifizierung veranschaulicht:
Öffnen Sie einen Text-Editor wie Microsoft Editor.
Kopieren Sie den folgenden Code in den Text-Editor, nachdem Sie "authenticationSite" durch den entsprechenden Text ersetzt haben, um die URL einer Website anzugeben, die [ ] HTTP-Authentifizierung erfordert.
// Load the WinHttpRequest object. var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); function getText1( ) { // Specify the target resource. WinHttpReq.open( "GET", "https://[authenticationSite]", false; // Send a request to the server and wait for a response. WinHttpReq.send( ); // Display the results of the request. WScript.Echo( "No Credentials: " ); WScript.Echo( WinHttpReq.Status + " " + WinHttpReq.StatusText); WScript.Echo( WinHttpReq.GetAllResponseHeaders); WScript.Echo( ); }; function getText2( ) { // HttpRequest SetCredentials flags HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0; // Specify the target resource. WinHttpReq.open( "GET", "https://[authenticationSite]", false ); // Set credentials for server. WinHttpReq.SetCredentials( "User Name", "Password", HTTPREQUEST_SETCREDENTIALS_FOR_SERVER); // It might also be necessary to supply credentials // to the proxy if you connect to the Internet // through a proxy that requires authentication. // Send a request to the server and wait for // a response. WinHttpReq.send( ); // Display the results of the request. WScript.Echo( "Credentials: " ); WScript.Echo( WinHttpReq.Status + " " + WinHttpReq.StatusText ); WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) ); WScript.Echo( ); }; getText1( ); getText2( );Speichern Sie die Datei als "Auth.js".
Geben Sie an einer Eingabeaufforderung "cscript Auth.js" ein, und drücken Sie die EINGABETASTE.
Sie verfügen nun über ein Programm, das eine Ressource auf zwei verschiedene Arten an fordert. Die erste Methode fordert die Ressource an, ohne Anmeldeinformationen anzugeben. Der Statuscode 401 wird zurückgegeben, um anzugeben, dass der Server eine Authentifizierung erfordert. Die Antwortheader werden ebenfalls angezeigt und sollten in etwa wie folgt aussehen:
Connection: Keep-Alive
Content-Length: 0
Date: Fri, 27 Apr 2001 01:47:18 GMT
Content-Type: text/html
Server: Microsoft-IIS/5.0
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
Cache-control: private
Obwohl die Antwort darauf hinweist, dass der Zugriff auf die Ressource verweigert wurde, gibt sie dennoch mehrere Header zurück, die einige Informationen zur Ressource bereitstellen. Der Header "WWW-Authenticate" gibt an, dass der Server eine Authentifizierung für diese Ressource erfordert. Wenn es einen Header mit dem Namen "Proxy-Authenticate" gibt, bedeutet dies, dass der Proxyserver eine Authentifizierung erfordert. Jeder Authentifizierungsheader enthält ein verfügbares Authentifizierungsschema und manchmal einen Bereich. Beim Bereichswert wird die Kleinschreibung beachtet, und es wird eine Gruppe von Servern oder Proxys definiert, für die die gleichen Anmeldeinformationen akzeptiert werden sollen.
Es gibt zwei Header mit dem Namen "WWW-Authenticate", die angeben, dass mehrere Authentifizierungsschemas unterstützt werden. Wenn Sie die GetResponseHeader-Methode aufrufen, um "WWW-Authenticate"-Header zu suchen, gibt die Methode nur den Inhalt des ersten Headers dieses Namens zurück. In diesem Fall wird der Wert "NTLM" zurückgegeben. Um sicherzustellen, dass alle Vorkommen eines Headers verarbeitet werden, verwenden Sie stattdessen die GetAllResponseHeaders-Methode.
Der zweite Methodenaufruf fordert dieselbe Ressource an, stellt jedoch zunächst Authentifizierungsanmeldeinformationen durch Aufrufen der SetCredentials-Methode zur Verfügung. Der folgende Codeabschnitt zeigt, wie diese Methode verwendet wird.
WinHttpReq.SetCredentials( "User Name", "Password",
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
Diese Methode legt den Benutzernamen auf "UserName" und das Kennwort auf "Password" fest und gibt an, dass die Autorisierungsanmeldeinformationen für den Ressourcenserver gelten. Authentifizierungsanmeldeinformationen können auch an einen Proxy gesendet werden.
Wenn Anmeldeinformationen angegeben werden, gibt der Server den Statuscode 200 zurück, der angibt, dass das Dokument abgerufen werden kann.
Überprüfen der Statuscodes
Das vorherige Beispiel ist anweisungsbeweisig, erfordert jedoch, dass der Benutzer explizit Anmeldeinformationen anfordert. Eine Anwendung, die Anmeldeinformationen bei Bedarf und keine Anmeldeinformationen ankn gibt, wenn sie nicht erforderlich ist, ist nützlicher. Um eine Funktion zu implementieren, die dies tut, müssen Sie Das Beispiel ändern, um den Statuscode zu untersuchen, der mit der Antwort zurückgegeben wird.
Eine vollständige Liste der möglichen Statuscodes sowie Beschreibungen finden Sie unter HTTP-Statuscodes. In diesem Beispiel sollte jedoch nur einer von drei Codes auftreten. Der Statuscode 200 gibt an, dass eine Ressource verfügbar ist und mit der Antwort gesendet wird. Der Statuscode 401 gibt an, dass der Server eine Authentifizierung erfordert. Der Statuscode 407 gibt an, dass der Proxy eine Authentifizierung erfordert.
Ändern Sie das Beispiel, das Sie im letzten Abschnitt erstellt haben, indem Sie die Funktion "getText2" durch den folgenden Code ersetzen (ersetzen Sie "authenticationSite" durch Ihren eigenen Text, um die URL einer Website angibt, die HTTP-Authentifizierung [ ] erfordert):
function getText2() {
WScript.Echo( "Credentials: " );
// HttpRequest SetCredentials flags.
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1;
// Specify the target resource.
var targURL = "https://[authenticationSite]";
WinHttpReq.open( "GET", targURL, false );
var Done = false;
var Attempts = 0;
do
{
// Keep track of the number of request attempts.
Attempts++;
// Send a request to the server and wait for a response.
WinHttpReq.send( );
// Obtain the status code from the response.
var Status = WinHttpReq.Status;
switch (Status)
{
// A 200 status indicates that the resource was retrieved.
case 200:
Done = true;
break;
// A 401 status indicates that the server
// requires authentication.
case 401:
WScript.Echo( "Requires Server UserName and Password." );
// Specify the target resource.
WinHttpReq.open( "GET", targURL, false );
// Set credentials for the server.
WinHttpReq.SetCredentials( "User Name",
"Password",
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
break;
// A 407 status indicates that the proxy
// requires authentication.
case 407:
WScript.Echo( "Requires Proxy UserName and Password." );
// Specify the target resource.
WinHttpReq.open( "GET", targURL, false );
// Set credentials for the proxy.
WinHttpReq.SetCredentials( "User Name",
"Password",
HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
break;
}
} while( ( !Done ) && ( Attempts < 3 ) );
// Display the results of the request.
WScript.Echo( WinHttpReq.Status + " " + WinHttpReq.StatusText );
WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) );
WScript.Echo( );
};
Speichern Sie die Datei erneut, und führen Sie sie aus. Die zweite Methode ruft das Dokument weiterhin ab, stellt jedoch nur bei Bedarf Anmeldeinformationen zurEntspricht. Die Funktion "getText2" führt die Open- und Send-Methoden so aus, als wäre keine Authentifizierung erforderlich. Der Status wird mit der Status-Eigenschaft abgerufen, und eine switch-Anweisung antwortet auf den resultierenden Statuscode. Wenn der Status 401 (Server erfordert Authentifizierung) oder 407 (Proxy erfordert Authentifizierung) ist, wird die Open-Methode erneut ausgeführt. Darauf folgt die SetCredentials-Methode, mit der der Benutzername und das Kennwort festgelegt werden. Der Code schleife dann zurück zur Send-Methode. Wenn die Ressource nach drei Versuchen nicht erfolgreich abgerufen werden kann, beendet die Funktion die Ausführung.