2011-08-31 5 views
5

C# uygulağım NTLM kimlik doğrulamasını kullanan bir web sunucusuna ulaşıyor.Birden çok HttpWebRequests genelinde NTLM kimlik doğrulaması nasıl?

Sunucuya yapılan her isteğin (yeni bir HttpWebRequest kullanarak) tek tek doğrulandığını buldum. Diğer bir deyişle, her istek 401 cevabıyla sonuçlanır, ardından gerçek yanıtı almadan önce bir NTLM el sıkışma konuşması gerçekleşir.

örn:

İlk GET isteği

:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM) 

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM base64stuff) 

-> GET xyz (Authorization: base64stuff) 
<- 200 

sonraki istekler: PreAuthenticate false olarak ayarlanmış ile başlangıçta

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided? 

-> GET xyz (Authorization: base64stuff) 
<- 200 

(, art arda istek ilk istek benziyordu - yani 'istek' başına üç temel istek:)

Orada bir İlk istekte gerçekleştirilen kimlik doğrulamasını daha sonraki HttpWebRequests ile sunucuya 'paylaşma' yolu?

Belki de UnsafeAuthenticatedConnectionSharing özelliğinin bunu yapmama izin verdiğini düşündüm, ancak uygulamanın içinde kullanılan tüm HttpWebRequest nesneleri için true değerine ayarlamanın bir etkisi yoktur.

Ancak, PreAuthenticate değerini true olarak ayarlarsanız, ilk isteğinden sonra her istek için 401 yanıt daha az olur.

+0

Ne sorunu çözmeye çalışıyoruz: Daha fazla bilgi için, NTLM düzeni hakkında çok yararlı ve anlaşılır bulmak Bu sayfayı, görüyor musunuz? –

+0

Bir kez etkin bir şekilde 'kimlik doğrulama' yapmak ve bunu HttpWebRequests genelinde yeniden kullanmak istiyorum. Sunucuya her vurduğumda kimlik doğrulaması yapmak yerine. Yine de NTLM'yi yanlış anlatabildim ve aslında NTLM, yapılan her talep üzerine ekstra bir talep yükü getirdi. – mackenir

+0

Evet, ancak şimdi nasıl çalıştığıyla ilgili sorun nedir, tanımladığınız davranışa, arzu ettiğiniz davranışa, gerçek dünyada ne elde etmeye çalışıyorsunuz, hangi sorunu çözecektir? –

cevap

3

Son istek NTLM gerçekleştirildikten sonra gönderilir (200 yanıtla sonuçlanan), sunucuya doğru kimlik bilgilerine sahip olduğunu bildiren bir auth üstbilgisi içerir.

İstemci sınıfının bunu kendi başına tutabilme özelliğine sahip olup olmadığından emin değilim, ancak bu üstbilgiyi korumanın ve sonraki isteklerinize eklemenin bir yolunu bulursanız iyi çalışmalıdır.


Güncelleme: NTLM bir bağlantının kimliğini doğrular, böylece Keep-Alive başlığını kullanarak bağlantınızı açık tutmanız gerekir. İstemci sınıfı bunun için bazı ayarlar sağlamalıdır.

http://www.innovation.ch/personal/ronald/ntlm.html

+0

Hmmm. Yetkilendirme üstbilgisini bir HttpWebRequest üzerinde ayarlamak mümkündür ve bunu denedim. Ancak işe yaramadı - sunucu 400 Yetki İsteği döndürerek Yetkilendirme başlığının bu şekilde "tekrarlanamadığını" belirtti. Güvenlik nedenleriyle mantıklı geliyor. – mackenir

+0

Yukarıdaki düzenlemelerimi görün – Iravanchi

+0

Bir test bitini yaptıktan sonra, HttpWebRequest bir KeepAlive özelliğine sahip olsa da, PreAuthenticate = true öğesinin üzerinde ve üstünde olan şeyleri iyileştirmediği görülüyor. Biraz sinir bozucu. – mackenir