Hitelesítés szkripttel

Ez a szakasz bemutatja, hogyan írhat olyan szkriptet, amely a WinHttpRequest objektumot használja a HTTP-hitelesítést igénylő kiszolgáló adatainak eléréséhez.

Előfeltételek és követelmények

A Microsoft JScript munkaalapú ismerete mellett ehhez a példához a következőkre van szükség:

  • A Microsoft Windows Software Development Kit (SDK) jelenlegi verziója.
  • A Microsoft Windows HTTP Services (WinHTTP) proxybeállításainak létrehozására szolgáló proxykonfigurációs eszköz, ha az internetkapcsolat proxykiszolgálón keresztül történik. További információkért lásd: Proxycfg.exe, proxykonfigurációs eszköz.
  • A hálózati terminológia és fogalmainak ismerete.

Webhely elérése hitelesítéssel

Hitelesítést bemutató szkript létrehozásához tegye a következőket:

  1. Nyisson meg egy szövegszerkesztőt, például a Microsoft Jegyzettömbet.

  2. Másolja a következő kódot a szövegszerkesztőbe, miután lecserélte a "[authenticationSite]" szöveget a megfelelő szövegre a HTTP-hitelesítést igénylő webhely URL-címének megadásához.

    // 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. Mentse a fájlt "Auth.js" néven.

  4. Egy parancssorból írja be a "cscript Auth.js" kifejezést, és nyomja le az ENTER billentyűt.

Most már rendelkezik egy olyan programmal, amely két különböző módon kér le egy erőforrást. Az első metódus hitelesítő adatok nélkül kéri le az erőforrást. A rendszer egy 401 állapotkódot ad vissza, amely azt jelzi, hogy a kiszolgáló hitelesítést igényel. A válaszfejlécek is megjelennek, és az alábbiakhoz hasonlóan kell kinéznie:

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

Bár a válasz azt jelzi, hogy az erőforráshoz való hozzáférés megtagadva, továbbra is több fejlécet ad vissza, amelyek bizonyos információkat nyújtanak az erőforrásról. A "WWW-Authentication" fejléc azt jelzi, hogy a kiszolgálónak hitelesítésre van szüksége ehhez az erőforráshoz. Ha van egy "Proxy-Authentication" nevű fejléc, az azt jelzi, hogy a proxykiszolgáló hitelesítést igényel. Minden hitelesítési fejléc tartalmaz egy elérhető hitelesítési sémát, és néha egy tartományt is. A tartomány értéke érzékeny a nagy- és kisbetűkre, és meghatározza azokat a kiszolgálókat vagy proxykat, amelyekhez ugyanazokat a hitelesítő adatokat el kell fogadni.

A "WWW-Authentication" két fejlécből áll, amelyek azt jelzik, hogy több hitelesítési séma is támogatott. Ha meghívja a GetResponseHeader metódust a "WWW-Authenticate" fejlécek kereséséhez, a metódus csak a név első fejlécének tartalmát adja vissza. Ebben az esetben az "NTLM" értéket adja vissza. A fejlécek összes előfordulásának feldolgozásához használja a GetAllResponseHeaders metódust.

A második metódushívás ugyanazt az erőforrást kéri le, de először a hitelesítő adatokat a Hitelesítő adatok beállítása metódus meghívásával adja meg. A kód következő szakasza bemutatja a metódus használatát.

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

Ez a módszer a felhasználónevet "UserName" (Felhasználónév) értékre állítja, a jelszót pedig "Jelszó" értékre, és azt jelzi, hogy az engedélyezési hitelesítő adatok az erőforrás-kiszolgálóra vonatkoznak. A hitelesítési hitelesítő adatok proxynak is elküldhetők.

Hitelesítő adatok megadásakor a kiszolgáló egy 200-as állapotkódot ad vissza, amely azt jelzi, hogy a dokumentum lekérhető.

Az állapotkódok ellenőrzése

Az előző példa utasításos, de megköveteli, hogy a felhasználó explicit módon adja meg a hitelesítő adatokat. Hasznosabb az olyan alkalmazás, amely szükség esetén hitelesítő adatokat szolgáltat, és nem ad meg hitelesítő adatokat, ha nem szükséges. Az ezt végrehajtó funkció implementálásához módosítania kell a példát a válaszsal visszaadott állapotkód vizsgálatához.

A lehetséges állapotkódok teljes listáját a leírásokkal együtt HTTP-állapotkódokcímű témakörben találja. Ebben a példában azonban a három kód közül csak egynek kell megjelennie. A 200-ból álló állapotkód azt jelzi, hogy egy erőforrás elérhető, és a válasz elküldése folyamatban van. A 401-ben megadott állapotkód azt jelzi, hogy a kiszolgáló hitelesítést igényel. A 407-ből álló állapotkód azt jelzi, hogy a proxy hitelesítést igényel.

Módosítsa az előző szakaszban létrehozott példát úgy, hogy a "getText2" függvényt cserélje le a következő kódra (cserélje le a "[authenticationSite]" szöveget a saját szövegére, hogy megadja a HTTP-hitelesítést igénylő webhely URL-címét):

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

Mentse és futtassa ismét a fájlt. A második metódus továbbra is lekéri a dokumentumot, de csak szükség esetén biztosít hitelesítő adatokat. A "getText2" függvény úgy hajtja végre a Open és Send metódusokat, mintha nem lett volna szükség hitelesítésre. Az állapot lekérése az Status tulajdonsággal történik, és egy kapcsolóutasítás válaszol az eredményként kapott állapotkódra. Ha az állapot 401 (a kiszolgáló hitelesítést igényel) vagy 407 (a proxy hitelesítést igényel), a Open metódus újra végrehajtásra kerül. Ezt követi a Hitelesítő adatok beállítása metódus, amely beállítja a felhasználónevet és a jelszót. A kód ezután visszalép a Küldés metódushoz. Ha három kísérlet után az erőforrás nem kérhető le sikeresen, akkor a függvény leállítja a végrehajtást.

hitelesítés a(z) WinHTTP-ben

WinHttpRequest

Hitelesítő adatok beállítása

HTTP/1.1 Megjegyzések kérése (RFC 2616)