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
- Accedere a un sito web con autenticazione
- controllo dei codici di stato
- argomenti correlati
Prerequisiti e requisiti
Oltre a una conoscenza approfondita di Microsoft JScript, questo esempio richiede quanto segue:
- Versione corrente di Microsoft Windows Software Development Kit (SDK).
- Lo strumento di configurazione proxy per stabilire le impostazioni proxy per Microsoft Windows HTTP Services (WinHTTP), se la connessione a Internet avviene tramite un server proxy. Per altre informazioni, vedere Proxycfg.exe, uno strumento di configurazione proxy.
- Familiarità con terminologia di rete e concetti.
Accesso a un sito Web con autenticazione
Per creare uno script che illustra l'autenticazione, eseguire le operazioni seguenti:
Apri un editor di testo come Microsoft Notepad.
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( );
Salvare il file come "Auth.js".
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 specificare le 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 comunque diverse intestazioni che forniscono alcune informazioni sulla risorsa. L'intestazione denominata "WWW-Authenticate" indica che il server richiede l'autenticazione per questa risorsa. Se è presente un'intestazione denominata "Proxy-Authenticate", indicherà 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 di ambito distingue tra lettere maiuscole e minuscole e definisce un insieme di server o proxy per i quali devono essere accettate le stesse credenziali.
Esistono due intestazioni chiamate "WWW-Authenticate", le quali indicano che sono supportati più schemi di autenticazione. Se si chiama il metodo GetResponseHeader per trovare le intestazioni "WWW-Authenticate", 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, utilizzare invece il metodo GetAllResponseHeaders.
La seconda chiamata al metodo richiede 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. Le credenziali di autenticazione possono anche essere inviate a un proxy.
Quando vengono specificate 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 è informativo, ma richiede che l'utente fornisca in modo esplicito le credenziali. Un'applicazione che fornisce le credenziali quando è necessario 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 riscontrare 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 proprio testo 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( );
};
Anche in questo caso, 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 (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.
Argomenti correlati
-
autenticazione in WinHTTP