Autenticazione tramite script

Questa sezione illustra come scrivere script che usa l'oggetto WinHttpRequest per accedere ai dati da un server che richiede l'autenticazione HTTP.

Prerequisiti e requisiti

Oltre a una conoscenza funzionante di Microsoft JScript, questo esempio richiede quanto segue:

  • Versione corrente di Microsoft Windows Software Development Kit (SDK).
  • Strumento di configurazione proxy per stabilire le impostazioni proxy per Microsoft Windows HTTP Services (WinHTTP), se la connessione a Internet è tramite un server proxy. Per altre informazioni , vedereProxycfg.exe, uno strumento di configurazione proxy .
  • Familiarità con la terminologia e i concetti della rete.

Accesso a un sito Web con autenticazione

Per creare uno script che illustra l'autenticazione, eseguire le operazioni seguenti:

  1. Aprire un editor di testo, ad esempio Il blocco note Microsoft.

  2. Copiare il codice seguente nell'editor di testo dopo aver sostituito "[authenticationSite]" con il testo appropriato per specificare l'URL di un sito che richiede l'autenticazione HTTP.

    // 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. Salvare il file come "Auth.js".

  4. Da un prompt dei comandi digitare "cscript Auth.js" e premere INVIO.

È ora disponibile un programma che richiede una risorsa in due modi diversi. Il primo metodo richiede la risorsa senza fornire credenziali. Viene restituito un codice di stato 401 per indicare che il server richiede l'autenticazione. Vengono visualizzate anche le intestazioni di risposta e dovrebbero essere simili alle seguenti:

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

Anche se la risposta indica che l'accesso alla risorsa è stato negato, restituisce ancora diverse intestazioni che forniscono alcune informazioni sulla risorsa. L'intestazione denominata "WWW-Authentication" indica che il server richiede l'autenticazione per questa risorsa. Se esiste un'intestazione denominata "Proxy-Authentication", indica che il server proxy richiede l'autenticazione. Ogni intestazione di autenticazione contiene uno schema di autenticazione disponibile e talvolta un'area di autenticazione. Il valore dell'area di autenticazione è distinzione tra maiuscole e minuscole e definisce un set di server o proxy per i quali devono essere accettate le stesse credenziali.

Esistono due intestazioni denominate "WWW-Authentication", che indicano che sono supportati più schemi di autenticazione. Se si chiama il metodo GetResponseHeader per trovare le intestazioni "WWW-Authentication", il metodo restituisce solo il contenuto della prima intestazione di tale nome. In questo caso, restituisce un valore "NTLM". Per assicurarsi che tutte le occorrenze di un'intestazione vengano elaborate, usare invece il metodo GetAllResponseHeaders .

Il secondo metodo chiama la stessa risorsa, ma prima fornisce le credenziali di autenticazione chiamando il metodo SetCredentials . Nella sezione seguente del codice viene illustrato come viene usato questo metodo.

WinHttpReq.SetCredentials( "User Name", "Password",
                               HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);

Questo metodo imposta il nome utente su "UserName", la password su "Password" e indica che le credenziali di autorizzazione si applicano al server di risorse. È anche possibile inviare le credenziali di autenticazione a un proxy.

Quando vengono fornite le credenziali, il server restituisce un codice di stato 200 che indica che il documento può essere recuperato.

Controllo dei codici di stato

L'esempio precedente è istruzioni, ma richiede che l'utente fornisca in modo esplicito le credenziali. Un'applicazione che fornisce le credenziali quando è necessaria e non fornisce le credenziali quando non è necessario è più utile. Per implementare una funzionalità che esegue questa operazione, è necessario modificare l'esempio per esaminare il codice di stato restituito con la risposta.

Per un elenco completo dei codici di stato possibili, insieme alle descrizioni, vedere Codici di stato HTTP. Per questo esempio, tuttavia, è consigliabile incontrare solo uno dei tre codici. Un codice di stato 200 indica che una risorsa è disponibile e viene inviata con la risposta. Un codice di stato 401 indica che il server richiede l'autenticazione. Un codice di stato 407 indica che il proxy richiede l'autenticazione.

Modificare l'esempio creato nell'ultima sezione sostituendo la funzione "getText2" con il codice seguente (sostituire "[authenticationSite]" con il testo personalizzato per specificare l'URL di un sito che richiede l'autenticazione HTTP):

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( );
};

Di nuovo, salvare ed eseguire il file. Il secondo metodo recupera ancora il documento, ma fornisce solo le credenziali quando necessario. La funzione "getText2" esegue i metodi Open e Send come se l'autenticazione non fosse necessaria. Lo stato viene recuperato con la proprietà Status e un'istruzione switch risponde al codice di stato risultante. Se lo stato è 401 (server richiede l'autenticazione) o 407 (il proxy richiede l'autenticazione), il metodo Open viene eseguito di nuovo. Questo è seguito dal metodo SetCredentials , che imposta il nome utente e la password. Il codice esegue quindi il ciclo al metodo Send . Se, dopo tre tentativi, la risorsa non può essere recuperata correttamente, la funzione arresta l'esecuzione.

Autenticazione in WinHTTP

WinHttpRequest

SetCredentials

Richiesta HTTP/1.1 per commenti (RFC 2616)