Udostępnij za pośrednictwem


Uwierzytelnianie przy użyciu skryptu

W tej sekcji przedstawiono sposób pisania skryptu korzystającego z obiektu WinHttpRequest w celu uzyskania dostępu do danych z serwera wymagającego uwierzytelniania HTTP.

Wymagania wstępne i wymagania

Oprócz działającej wiedzy na temat języka Microsoft JScript ten przykład wymaga następujących elementów:

  • Bieżąca wersja zestawu Microsoft Windows Software Development Kit (SDK).
  • Narzędzie konfiguracji serwera proxy do ustanawiania ustawień serwera proxy dla usług HTTP systemu Microsoft Windows (WinHTTP), jeśli połączenie z Internetem odbywa się za pośrednictwem serwera proxy. Aby uzyskać więcej informacji, zobacz Proxycfg.exe, narzędzie konfiguracji serwera proxy.
  • Znajomość terminologii sieciowej i pojęć.

Uzyskiwanie dostępu do witryny sieci Web przy użyciu uwierzytelniania

Aby utworzyć skrypt demonstrujący uwierzytelnianie, wykonaj następujące czynności:

  1. Otwórz edytor tekstów, taki jak Microsoft Notatnik.

  2. Skopiuj następujący kod do edytora tekstów po zastąpieniu ciągu "[authenticationSite]" odpowiednim tekstem, aby określić adres URL witryny wymagającej uwierzytelniania 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. Zapisz plik jako "Auth.js".

  4. W wierszu polecenia wpisz "cscript Auth.js" i naciśnij ENTER.

Masz teraz program, który żąda zasobu na dwa różne sposoby. Pierwsza metoda żąda zasobu bez podawania poświadczeń. Zwracany jest kod stanu 401, aby wskazać, że serwer wymaga uwierzytelniania. Nagłówki odpowiedzi są również wyświetlane i powinny wyglądać podobnie do następujących:

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

Mimo że odpowiedź wskazuje, że dostęp do zasobu został odrzucony, nadal zwraca kilka nagłówków, które zawierają pewne informacje o zasobie. Nagłówek o nazwie "WWW-Authentication" wskazuje, że serwer wymaga uwierzytelniania dla tego zasobu. Jeśli istnieje nagłówek o nazwie "Proxy-Authentication", oznacza to, że serwer proxy wymaga uwierzytelniania. Każdy nagłówek uwierzytelniania zawiera dostępny schemat uwierzytelniania, a czasami obszar. Wartość realm jest rozróżniana ze względu na wielkość liter i definiuje zbiór serwerów lub serwerów proxy, dla których należy stosować te same poświadczenia.

Istnieją dwa nagłówki o nazwie "WWW-Authentication", które wskazują, że obsługiwane są wiele schematów uwierzytelniania. Jeśli wywołasz metodę GetResponseHeader w celu znalezienia nagłówków "WWW-Authenticate", metoda zwraca tylko zawartość pierwszego nagłówka tej nazwy. W tym przypadku zwraca wartość "NTLM". Aby upewnić się, że wszystkie wystąpienia nagłówka są przetwarzane, zamiast tego użyj metody GetAllResponseHeaders.

Drugie wywołanie metody żąda tego samego zasobu, ale najpierw dostarcza poświadczenia uwierzytelniania przez wywołanie metody SetCredentials. W poniższej sekcji kodu przedstawiono sposób użycia tej metody.

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

Ta metoda ustawia nazwę użytkownika na "UserName", hasło na "Hasło" i wskazuje, że poświadczenia autoryzacji mają zastosowanie do serwera zasobów. Poświadczenia uwierzytelniania można również wysyłać do serwera proxy.

Po podaniu poświadczeń serwer zwraca kod stanu 200, który wskazuje, że dokument można pobrać.

Sprawdzanie kodów stanu

W poprzednim przykładzie przedstawiono instrukcje, ale wymaga jawnego podania poświadczeń przez użytkownika. Aplikacja dostarczająca poświadczenia, gdy jest to konieczne i nie dostarcza poświadczeń, gdy nie jest to konieczne, jest bardziej przydatna. Aby zaimplementować funkcję, która to robi, należy zmodyfikować przykład, aby sprawdzić kod stanu zwrócony z odpowiedzią.

Aby uzyskać pełną listę możliwych kodów stanu wraz z opisami, zobacz kody stanu HTTP. W tym przykładzie należy jednak napotkać tylko jeden z trzech kodów. Kod stanu 200 wskazuje, że zasób jest dostępny i jest wysyłany z odpowiedzią. Kod stanu 401 wskazuje, że serwer wymaga uwierzytelniania. Kod stanu 407 wskazuje, że serwer proxy wymaga uwierzytelniania.

Zmodyfikuj przykład utworzony w ostatniej sekcji, zastępując funkcję "getText2" następującym kodem (zastąp ciąg "[authenticationSite]" własnym tekstem, aby określić adres URL witryny wymagającej uwierzytelniania 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( );
};

Ponownie zapisz i uruchom plik. Druga metoda nadal pobiera dokument, ale udostępnia poświadczenia tylko wtedy, gdy jest to wymagane. Funkcja "getText2" wykonuje metody Open i Send tak, jakby uwierzytelnianie nie było wymagane. Stan jest pobierany z właściwością Status, a instrukcja switch odpowiada na wynikowy kod stanu. Jeśli stan to 401 (serwer wymaga uwierzytelniania) lub 407 (serwer proxy wymaga uwierzytelniania), metoda Open jest wykonywana ponownie. Następnie następuje metoda SetCredentials, która ustawia nazwę użytkownika i hasło. Następnie kod wraca do metody Send. Jeśli po trzech próbach nie można pomyślnie pobrać zasobu, funkcja zatrzymuje wykonywanie.

Uwierzytelnianie w usłudze WinHTTP

WinHttpRequest

UstawCredenciales

żądanie HTTP/1.1 dotyczące komentarzy (RFC 2616)