Freigeben über


Authentifizierung mit Skript

In diesem Abschnitt wird das Schreiben eines Skripts veranschaulicht, das das WinHttpRequest-Objekt verwendet, um auf Daten von einem Server zuzugreifen, für den die HTTP-Authentifizierung erforderlich ist.

Voraussetzungen und Anforderungen

Zusätzlich zu den Kenntnissen von 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-Dienste (WinHTTP), wenn Ihre Verbindung mit dem Internet über einen Proxyserver besteht. Weitere Informationen finden Sie unterProxycfg.exe, einem 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:

  1. Öffnen Sie einen Text-Editor wie Microsoft Editor.

  2. Kopieren Sie den folgenden Code in den Text-Editor, nachdem Sie "[authenticationSite]" durch den entsprechenden Text ersetzt haben, um die URL einer Website anzugeben, für die die HTTP-Authentifizierung erforderlich ist.

    // 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( );
    
  3. Speichern Sie die Datei als "Auth.js".

  4. Geben Sie an einer Eingabeaufforderung "cscript Auth.js" ein, und drücken Sie die EINGABETASTE.

Sie verfügen jetzt über ein Programm, das eine Ressource auf zwei verschiedene Arten anfordert. Die erste Methode fordert die Ressource an, ohne Anmeldeinformationen anzugeben. Ein 401 status Code wird zurückgegeben, um anzugeben, dass der Server eine Authentifizierung erfordert. Die Antwortheader werden ebenfalls angezeigt und sollten 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 angibt, dass der Zugriff auf die Ressource verweigert wurde, gibt sie dennoch mehrere Header zurück, die einige Informationen zur Ressource bereitstellen. Der Header mit dem Namen "WWW-Authenticate" gibt an, dass der Server eine Authentifizierung für diese Ressource erfordert. Wenn es einen Header mit dem Namen "Proxy-Authenticate" gäbe, würde dies darauf hindeuten, dass der Proxyserver eine Authentifizierung erfordert. Jeder Authentifizierungsheader enthält ein verfügbares Authentifizierungsschema und manchmal einen Bereich. Der Bereichswert berücksichtigt die Groß-/Kleinschreibung und definiert einen Satz von Servern oder Proxys, für die dieselben 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 nach "WWW-Authenticate"-Headern zu suchen, gibt die Methode nur den Inhalt des ersten Headers dieses Namens zurück. In diesem Fall wird der Wert "NTLM" zurückgegeben. Verwenden Sie stattdessen die GetAllResponseHeaders-Methode , um sicherzustellen, dass alle Vorkommen eines Headers verarbeitet werden.

Der zweite Methodenaufruf fordert dieselbe Ressource an, stellt jedoch zunächst Authentifizierungsanmeldeinformationen bereit, indem die SetCredentials-Methode aufgerufen wird. 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" fest, das Kennwort auf "Password" 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 einen Code mit 200 status zurück, der angibt, dass das Dokument abgerufen werden kann.

Überprüfen der Statuscodes

Das vorherige Beispiel ist eine Anweisung, erfordert jedoch, dass der Benutzer explizit Anmeldeinformationen angibt. Eine Anwendung, die Anmeldeinformationen bereitstellt, wenn dies erforderlich ist, und keine Anmeldeinformationen bereitstellt, wenn sie nicht erforderlich ist, ist nützlicher. Um ein Feature zu implementieren, das dies tut, müssen Sie Ihr Beispiel ändern, um den mit der Antwort zurückgegebenen status Code zu untersuchen.

Eine vollständige Liste der möglichen status-Codes sowie Beschreibungen finden Sie unter HTTP-Statuscodes. In diesem Beispiel sollte jedoch nur einer von drei Codes auftreten. Ein status Code von 200 gibt an, dass eine Ressource verfügbar ist und mit der Antwort gesendet wird. Ein status Code 401 gibt an, dass der Server eine Authentifizierung erfordert. Ein status Code 407 gibt an, dass der Proxy eine Authentifizierung erfordert.

Ändern Sie das im letzten Abschnitt erstellte Beispiel, 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 weiterhin das Dokument ab, stellt jedoch nur bei Bedarf Anmeldeinformationen bereit. Die Funktion "getText2" führt die Open - und Send-Methoden so aus, als ob keine Authentifizierung erforderlich wäre. Der status wird mit der Status-Eigenschaft abgerufen, und eine switch-Anweisung reagiert auf den resultierenden status-Code. 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 , die den Benutzernamen und das Kennwort festlegt. Der Code wird dann zurück zur Send-Methode ausgeführt. Wenn die Ressource nach drei Versuchen nicht erfolgreich abgerufen werden kann, beendet die Funktion die Ausführung.

Authentifizierung in WinHTTP

WinHttpRequest

Setcredentials

HTTP/1.1 Request for Comments (RFC 2616)