Aracılığıyla paylaş


Betik Kullanarak Kimlik Doğrulaması

Bu bölümde, HTTP kimlik doğrulaması gerektiren bir sunucudan verilere erişmek için winhttprequest nesnesini kullanan betiğin nasıl yazıldığını gösterir.

Önkoşullar ve Gereksinimler

Microsoft JScript'in çalışan bilgilerine ek olarak, bu örnek aşağıdakileri gerektirir:

  • Microsoft Windows Yazılım Geliştirme Seti'nin (SDK) geçerli sürümü.
  • İnternet bağlantınız bir ara sunucu üzerindenyse, Microsoft Windows HTTP Hizmetleri (WinHTTP) için ara sunucu ayarlarını oluşturmak için ara sunucu yapılandırma aracı. Daha fazla bilgi için bkz. Proxycfg.exe, Ara Sunucu Yapılandırma Aracı.
  • ağ terminolojisi ve kavramları hakkında bilgi.

Kimlik Doğrulaması ile Bir Web Sitesine Erişme

Kimlik doğrulamasını gösteren bir betik oluşturmak için aşağıdakileri yapın:

  1. Microsoft Not Defteri gibi bir metin düzenleyicisi açın.

  2. HTTP kimlik doğrulaması gerektiren bir sitenin URL'sini belirtmek için "[authenticationSite]" öğesini uygun metinle değiştirdikten sonra aşağıdaki kodu metin düzenleyicisine kopyalayın.

    // 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. Dosyayı "Auth.js" olarak kaydedin.

  4. Komut isteminden "cscript Auth.js" yazın ve ENTER tuşuna basın.

Artık iki farklı yolla kaynak isteyen bir programınız var. İlk yöntem, kimlik bilgileri sağlamadan kaynağı istemektedir. Sunucunun kimlik doğrulaması gerektirdiğini belirtmek için bir 401 durum kodu döndürülür. Yanıt üst bilgileri de görüntülenir ve aşağıdakine benzer olmalıdır:

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

Yanıt kaynağa erişimin reddedildiğini belirtse de, yine de kaynak hakkında bazı bilgiler sağlayan birkaç üst bilgi döndürür. "WWW-Authenticate" adlı üst bilgi, sunucunun bu kaynak için kimlik doğrulaması gerektirdiğini gösterir. "Proxy-Authenticate" adlı bir üst bilgi varsa, proxy sunucusunun kimlik doğrulaması gerektirdiğini gösterir. Her kimlik doğrulama üst bilgisi kullanılabilir bir kimlik doğrulama şeması ve bazen de bir bölge içerir. Bölge değeri büyük/küçük harfe duyarlıdır ve aynı kimlik bilgilerinin kabul edilmesi gereken sunucu veya proxy setini tanımlar.

Birden çok kimlik doğrulama düzeninin desteklendiğini gösteren "WWW-Authenticate" adlı iki üst bilgi vardır. "WWW-Authenticate" üst bilgilerini bulmak için GetResponseHeaderyöntemini çağırırsanız, yöntem yalnızca bu adın ilk üst bilgisinin içeriğini döndürür. Bu durumda, "NTLM" değerini döndürür. Üst bilginin tüm oluşumlarının işlenmesini sağlamak için bunun yerine GetAllResponseHeadersyönteminikullanın.

İkinci yöntem çağrısı aynı kaynağı istemektedir, ancak ilk olarak SetCredentials yöntemini çağırarak kimlik doğrulaması kimlik bilgilerini sağlar. Kodun aşağıdaki bölümünde bu yöntemin nasıl kullanıldığı gösterilmektedir.

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

Bu yöntem, kullanıcı adını "UserName" olarak, parolayı "Password" olarak ayarlar ve yetkilendirme kimlik bilgilerinin kaynak sunucuya uygulandığını gösterir. Kimlik doğrulama kimlik bilgileri bir ara sunucuya da gönderilebilir.

Kimlik bilgileri sağlandığında, sunucu belgenin alınabileceğini belirten 200 durum kodunu döndürür.

Durum Kodlarını Denetleme

Önceki örnek açıklayıcıdır, ancak kullanıcının kimlik bilgilerini açıkça sağlamasını gerektirir. Gerektiğinde kimlik bilgileri sağlayan ve gerekli olmadığında kimlik bilgileri sağlamayan bir uygulama daha kullanışlıdır. Bunu sağlayan bir özelliği uygulamak için örneğinizi değiştirerek yanıtla birlikte döndürülen durum kodunu incelemeniz gerekir.

Olası durum kodlarının tam listesi ve açıklamaları için bkz. http durum kodları. Ancak bu örnekte üç koddan yalnızca biriyle karşılaşmalısınız. 200 durum kodu, bir kaynağın kullanılabilir olduğunu ve yanıtla birlikte gönderildiğini gösterir. 401 durum kodu, sunucunun kimlik doğrulaması gerektirdiğini gösterir. 407 durum kodu, proxy'nin kimlik doğrulaması gerektirdiğini gösterir.

"getText2" işlevini aşağıdaki kodla değiştirerek son bölümde oluşturduğunuz örneği değiştirin (HTTP kimlik doğrulaması gerektiren bir sitenin URL'sini belirtecek şekilde "[authenticationSite]" öğesini kendi metninizle değiştirin):

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

Dosyayı yeniden kaydedin ve çalıştırın. İkinci yöntem belgeyi almaya devam eder, ancak yalnızca gerektiğinde kimlik bilgilerini sağlar. "getText2" işlevi, Open ve Send yöntemlerini kimlik doğrulaması gerekli değil gibi yürütür. Durum, Durum özelliğiyle alınır ve switch deyimi sonuçta elde edilen durum koduna yanıt verir. Durum 401 (sunucu kimlik doğrulaması gerektirir) veya 407 ise (proxy kimlik doğrulaması gerektirir), Open yöntemi yeniden yürütülür. Bunu, kullanıcı adını ve parolayı ayarlayan SetCredentials yöntemi izler. Kod daha sonra Send yöntemine geri döner. Üç denemeden sonra kaynak başarıyla alınamazsa işlev yürütmeyi durdurur.

WinHTTP'de Kimlik Doğrulama

WinHttpRequest

SetCredentials

HTTP/1.1 Açıklama İsteği (RFC 2616)